{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Basic Image Classification with Feedforward NN and LetNet5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All libraries we introduced in the last chapter provide support for convolutional layers. We are going to illustrate the LeNet5 architecture using the most basic MNIST handwritten digit dataset, and then use AlexNet on CIFAR10, a simplified version of the original ImageNet to demonstrate the use of data augmentation.\n",
    "LeNet5 and MNIST using Keras."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:37.512269Z",
     "start_time": "2020-06-21T18:32:36.122673Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "from pathlib import Path\n",
    "from random import randint\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.datasets import mnist\n",
    "import tensorflow.keras.backend as K\n",
    "from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping \n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import (Conv2D, \n",
    "                                     AveragePooling2D, \n",
    "                                     Dense, \n",
    "                                     Dropout, \n",
    "                                     Flatten)\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:37.537404Z",
     "start_time": "2020-06-21T18:32:37.513475Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using GPU\n"
     ]
    }
   ],
   "source": [
    "gpu_devices = tf.config.experimental.list_physical_devices('GPU')\n",
    "if gpu_devices:\n",
    "    print('Using GPU')\n",
    "    tf.config.experimental.set_memory_growth(gpu_devices[0], True)\n",
    "else:\n",
    "    print('Using CPU')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:39:40.507651Z",
     "start_time": "2020-06-21T18:39:40.505328Z"
    }
   },
   "outputs": [],
   "source": [
    "sns.set_style('whitegrid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:37.568265Z",
     "start_time": "2020-06-21T18:32:37.556251Z"
    }
   },
   "outputs": [],
   "source": [
    "results_path = Path('results')\n",
    "mnist_path = results_path / 'mnist'\n",
    "if not mnist_path.exists():\n",
    "    mnist_path.mkdir(parents=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load MNIST Database"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The original MNIST dataset contains 60,000 images in 28x28 pixel resolution with a single grayscale containing handwritten digits from 0 to 9. A good alternative is the more challenging but structurally similar Fashion MNIST dataset that we encountered in Chapter 12 on Unsupervised Learning."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can load it in keras out of the box:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:37.781365Z",
     "start_time": "2020-06-21T18:32:37.569504Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The MNIST database has a training set of 60000 examples.\n",
      "The MNIST database has a test set of 10000 examples.\n"
     ]
    }
   ],
   "source": [
    "# use Keras to import pre-shuffled MNIST database\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "\n",
    "print(\"The MNIST database has a training set of %d examples.\" % len(X_train))\n",
    "print(\"The MNIST database has a test set of %d examples.\" % len(X_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:37.786327Z",
     "start_time": "2020-06-21T18:32:37.782548Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((60000, 28, 28), (10000, 28, 28))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualize First 10 Training Images"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The below figure shows the first ten images in the dataset and highlights significant variation among instances of the same digit. On the right, it shows how the pixel values for an indivual image range from 0 to 255."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:39.214214Z",
     "start_time": "2020-06-21T18:32:37.788329Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABXgAAAI4CAYAAADQ9IHVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeZyVddk/8GsAERCBCASVFMocEWUQdHBBIFDyMdd6DDEWLXFB1HJ5zDRBRTNFS8UtNBExNxARH4tE1FyQJVxSExf8iai5obKpCHN+f/iCJwLOd2AOM+ce3u/Xiz861zXX/T2TXAwf7rmnJJfL5QIAAAAAgMypU9MHAAAAAABg4wh4AQAAAAAySsALAAAAAJBRAl4AAAAAgIwS8AIAAAAAZJSAFwAAAAAgowS8AACbmfvuuy9KS0uTv6ZOnbpG/5gxYwp6jsWLF8e4ceM26mNPO+20OPzww9dbf/3112PIkCGxzz77RJcuXeJnP/tZvPTSS5Wava7Pzy677BJlZWXRq1evOOuss+KFF15Y58eWlpbmPVdlrvufn+cHH3ww3n777Y2aCQBA7Vevpg8AAEDNKC8vj/Ly8vXW27VrFxER7du3j6FDh0anTp0Kev3vf//70bJly+jfv/8Gfdwtt9wSU6ZMiV122WWd9TfeeCP69esXFRUVceihh0ZJSUk88MAD0a9fvxg3blx07NixUtf5989PLpeLpUuXxrx58+LPf/5zPPTQQzFs2LDo27fvGh8zdOjQaNGixQa9n1XW9Xm+4oor4uabb477779/o2YCAFD7CXgBADZT5eXlceqppyb72rdvH+3bty/49T/++ONo2bJlpftXrlwZV155Zdxyyy15+y655JJYtmxZjB8/fvW5+/XrFz/+8Y/jwgsvjAkTJlTqeuv7/Lzwwgtx/PHHx4UXXhjf+c53Ys8991xdq8znc33W9Xn++OOPN3oeAACbB49oAACg6L300kvxwx/+MG655ZbYb7/91tv3//7f/4unnnoqevfuvUZYuvPOO8dhhx0WL774Yvzzn/+s0lk6duwYw4cPj5UrV8bvf//7Ks0CAICqEvACAJDXup4NW1paGr/85S/jxhtvjD333DP23HPP1fUnn3wyBg0aFPvss0+UlZXFoYceGjfddFMsX748IiJmzJgRpaWlERHxyiuvRGlpaVx77bV5zzBt2rSYP39+nHXWWTF69Oj19s2aNSsiIrp27bpWbdVrM2fOrPR7X5//+q//iu233z5mzZoVH3zwwerX1/UM3o8++iguuOCC2H///aOsrCyOOeaYmDNnThx77LHRq1ev1X3/+Xnu1atXTJw4MSIijjjiiDV6H3zwwTj66KNjr732ij322CN+9KMfxZ/+9KfI5XJVfm8AAGSLgBcAgI3yxBNPxOjRo+OII46Ibt26RVlZWcyePTtOOumkmDdvXhx88MHxk5/8JOrWrRtXXXVVDB8+PCIitt9++xg6dGhERLRo0SKGDh2a91nAERHf+9734uGHH47BgwdH3bp119u36oeRfetb31qrtv3220fE13f5VlVJSUnsscceERExZ86c9fZ98sknccwxx8Tdd98dO++8c/zkJz+JL774IgYNGhRvvPFG3msMHDhw9XOG+/btGwMHDoyIiIceeijOPPPM+OSTT+LII4+Mvn37xqJFi+LCCy+M66+/vsrvDQCAbPEMXgCAzdTMmTPXe+fskUceGW3atMn78R999FHccMMNa9xZetppp8VXX30Vf/rTn1aHrF999VUcddRRcf/998e5554bbdq0iVNPPTVGjRoVLVq0qNRza3fbbbdKvadPP/00IiKaNGmyVm3rrbeOiIjFixdXalZKq1atIiLiww8/XG/PqFGj4q233or/+Z//iZ/97GcREVFRURFnnHFG/PnPf14dOq/LscceG6+88kq88sor0a9fv9WPnLj55pujUaNGMWHChGjcuHFEfP3D3Q466KAYN25cDBkyJEpKSgryHgEAKH4CXgCAzdTMmTPX+7iC8vLyZMDboEGD6NGjxxqvVVRURETE3//+99UB7xZbbBGjR4+OBg0arA5ZN5WvvvoqIiLq16+/Vm3Va6seFVFVq+YtWbJknfWVK1fG5MmTY/vtt49jjz129et16tSJ//mf/4m//vWvG3XdXC4XX3zxRbz88sur73xu3LhxjB8/Ppo0aSLcBQDYzAh4AQA2U0OHDq3U3bPr07p167Uel3DUUUfF1KlT45xzzokbbrgh9t9//+jevXvsvffe6wxdC61BgwYR8X9B779bFew2bNiwINdaunRpREQ0atRonfW33norPvvss9h7773X+jxtt9120bp16426bt++fWPYsGExYMCAKC0tje7du0ePHj2iS5cuUaeOJ7ABAGxufAUIAMBGWRWm/rsePXrE2LFjo2fPnvHuu+/G7bffHoMHD479998/br/99k1+plWPZljXYxhWvVaou4jfeeediFj3834jvn7+bsTXzxlel2222Wajrnv00UfHqFGjory8PF5//fUYPXp09O/fP3r27BkPPfTQRs0EACC73MELAEBBlZeXR3l5eSxbtixmz54djz32WEycODFGjBgRO+yww1qPdSikdu3aRUTEggUL1qqtem1VT1WsWLEinnvuuahTp06UlZWts2fV83HX9wiHVXcAb4wDDzwwDjzwwFi0aFHMmDEjpk2bFpMnT44zzzwzdtppp9h55503ejYAANniDl4AAArmtttui9///vcR8fWjC7p37x4XXHBBDBs2LCK+fjbvptSlS5eIiJg1a9ZatVXPG+7UqVOVrzNlypT4+OOPY999941vfvOb6+z59re/HY0aNYoXXnhhrdqiRYvizTffTF7nP5+nu3z58rjhhhtizJgxEfH1HcsHHnhg/OY3v4mTTz45Kioq4tlnn93wNwQAQGYJeAEAKJgnn3wybrzxxnjuuefWeH3V4wy222671a9tscUW63xWblV861vfis6dO8eUKVPiH//4x+rXX3311XjggQdit912iw4dOlTpGq+88kqMGDEi6tatG6effvp6+7bYYos49NBD480334w777xz9esVFRVxxRVXVOq916v39Tfc/fsPj3vwwQfj6quvjrfffnuN3nV9jgEAqP08ogEAgII59dRTY8aMGTFw4MA46KCDolWrVvH666/Ho48+Gt/5znfisMMOW927zTbbxLx582LYsGHRo0eP6NWrV0HOcN5550X//v1j4MCBceihh0bdunXjgQceiFwut/pO4sqYOXNmXHvttRERkcvlYtmyZfHaa6/F9OnTIyLiwgsvjI4dO+ad8fOf/zyeeOKJGD58eDzyyCOx0047xaxZs2LevHnRoEGD5A9Fa9WqVUREXHbZZbHvvvvG0KFD44wzzohTTjkljjzyyDjooIOiadOm8eKLL8YzzzwT5eXlsd9++1X6PQIAkH0CXgAACqZjx44xbty4uOGGG+KZZ56JhQsXxjbbbBMDBw6Mk08+ORo1arS694ILLogRI0bEhAkTYsWKFQULeHfbbbe444474qqrrorJkyfHFltsEZ06dYqf//znsfvuu1d6zsyZM1c/1iEiYsstt4zWrVvH4YcfHgMHDoz27dsnZzRv3jzuvPPOGDlyZDzxxBMxc+bMKCsri7Fjx8aJJ54YDRs2zPvxxxxzTMyZMydmz54db7zxRhx33HHRu3fvuOWWW2L06NHx6KOPxqJFi2K77baLU045JQYPHpwMjQEAqF1KcrlcrqYPAQAAtdH8+fOjdevWUb9+/TVeX758eXTu3Dn22WefGD16dA2dDgCA2sA/7wMAwCYyZMiQ2G+//WLRokVrvH7bbbfFV199FV27dq2hkwEAUFu4gxcAADaRO+64Iy666KJo3bp19O7dOxo2bBgvv/xyPP3001FaWhr33ntvbLnlljV9TAAAMkzACwAAm9Bf//rXuP322+O1116LZcuWxbbbbhvf//7348QTT4ytttqqpo8HAEDGCXgBAAAAADLKM3gBAAAAADJKwAsAAAAAkFECXgAAAACAjBLwAgAAAABklIAXAAAAACCjBLwAAAAAABkl4AUAAAAAyCgBL+uUy+Vq+gjAZsTOAaqbvQNUN3sHqG72zuZDwJsBAwYMiNLS0tW/dt111+jatWscf/zxMX369DV677vvvigtLY2FCxdWen6vXr3ioosuioiI5cuXx4gRI+KRRx7ZoDPmcrno3LnzGucsLS2NH/7whxs0B6h5Wdg5ERFTp06NQw89NDp27BiHHXZYPProoxs8AygOWdk7q+RyuRg4cGAMGDBgo2cANStre+ell16KXXfddYPOABSXLOydFStWxNVXXx09evSIsrKyOProo2PGjBkbNIOaUa+mD0DldO7cOc4555yI+Po33AcffBB33XVXHHfccTFy5Mg45JBDIiKiZ8+ecffdd0eTJk0qPXvUqFGr+z/44IO4/fbbY88999yg8y1YsCCWLl0av/3tb6Nt27arX2/UqNEGzQGKQ7HvnOnTp8dpp50W/fr1i7PPPjsmT54cQ4cOjTvuuCM6deq0QbOA4lDse+ff3XPPPTFjxowoLy/f6BlAzcvK3pk3b16cdNJJsXLlyo36eKB4FPveufDCC+O+++6L448/PsrLy+OJJ56In/3sZ/HHP/7R1z1FTsCbEU2aNFkrtDjooINi0KBBMXz48Nh///2jadOm0bx582jevPkGzd51112rfL65c+dGnTp14vvf/340bNiwyvOAmlXsO+e6666LfffdN379619HRET37t3j3XffjRtvvDFuvPHGKs8Hql+x751V/vWvf8UVV1wR22yzTcFmAjWj2PdORUVFTJgwIX77299GnTq++RZqg2LeOx9//HGMHz8+jj/++PjFL34RERH77bdffPDBB3H55ZfH+PHjqzSfTcufEhlWp06dGDJkSCxevDj+8pe/RMTat/FXVFTEqFGjonv37lFWVhannnpqjBkzJkpLS1fPWXUb/4IFC6J3794REXH66aev/rbDVTPz3Zb/yiuvxA477CDchVqsWHbOF198Ec8++2z06tVrjdd79+4d06dPd3cL1CLFsnf+3fDhw+PAAw+M3XffvdBvFygCxbR35s6dGxdffHH0798/zjrrrE31loEaVix7Z/78+VFRURHdunVb4/UuXbrEP/7xj/j0008L/t4pHAFvxpWXl0fdunXj2WefXWf997//fdx4441xzDHHxDXXXBMREVdeeeU6e7fZZpsYNWpUREScccYZMWzYsIj4v28N6NChw3rP8eqrr0b9+vXjpz/9aZSVlcXee+8dl19+eXz11VdVeXtAkSmGnfP222/HihUrYscdd1zj9W9961vxxRdfxHvvvbdR7w0oTsWwd1Z54IEH4oUXXlj9rZVA7VQse2fbbbeNhx9+OH7+859HvXq++RZqs2LYO9tuu21ExFp/n1qwYEFERLzzzjsb+K6oTv6UyLi6detGs2bN4qOPPlqrtmTJkrj11lvjxBNPjJNOOikivv425sMPPzzmzp27Vn/9+vWjffv2ERGx4447xk477RQRUalvDZg7d27861//ir59+8bJJ58cs2fPjhtuuCE++eST+M1vflPVtwkUiWLYOUuWLImIiK222mqN11f971V1oHYohr0TEbFw4cK45JJLYtiwYdGsWbOqvi2giBXL3rFrYPNRDHundevWUV5eHldddVW0bt06OnToEE8//XRMmDAhIiI+//zzKr9PNh138NZizz//fCxfvjwOOOCA1a+VlJREnz59Cn6tSy+9NO6+++7o379/7LXXXnHyySfH0KFDY+LEif6VBzYT1bVzcrnc6tnret0z6mDzUZ1f61x88cWxxx57xMEHH1zw2UB2VOfeAYio3r1zxRVXxI477hiDBg2KPffcM66++uoYMmRIREQ0aNCg4NejcNzBm3FffvllfPbZZ9GqVau1ap988klExFr/QtOiRYuCn6NLly5rvda9e/e48sor49VXX43tt9++4NcEql8x7Jytt946IiKWLl26xuvLli1bow7UDsWwd6ZOnRqPPfZYTJ48OVasWBERX/+jUi6XixUrVkTdunXX+kcnILuKYe8Am5di2TutW7eO22+/PT766KNYvHhxtG3bNu6///6IiGjatGnBr0fhuM0p42bPnh0rVqxYZ8C66qc7r3oo9yr/+b+ravHixXHvvffG/Pnz13j9iy++iIiIb3zjGwW9HlBzimHnfOtb34o6derE22+/vcbrb7/9djRq1MhPtodaphj2ztSpU2PZsmXRu3fv6NChQ3To0CGmTZsWs2bNig4dOsTMmTMLej2gZhXD3gE2L8Wwd3K5XDz44IMxb968aNGiRbRr1y5KSkpi7ty50aRJEzfuFTkBb4blcrn4wx/+EM2aNVvnrfnt27ePrbbaKh555JE1Xp82bdp6Z9atW3eDz7HFFlvERRddFGPHjl3j9SlTpkTTpk1j55133uCZQPEplp3ToEGD2GOPPWLq1KlrvP7II49E165dN2omUJyKZe8MHTo0xo8fv8av8vLy6NChQ4wfPz75w9mA7CiWvQNsPopl75SUlMS1114bf/rTn1a/9tlnn8WDDz4YPXr08Ci8IucRDRmxaNGieO655yIiYsWKFfH+++/HvffeG7NmzYqRI0dG48aN1/qYrbfeOgYNGhQ33XTT6odsT5o0KV566aX1fhvhqm9tfvrpp6Nt27axyy67xMKFC2P+/Pmx0047rfM6DRo0iOOOOy5uvvnmaNasWXTu3DmeeuqpGDNmTJx33nnRqFGjAn4mgOpQzDsnIuLEE0+ME044IX7961/HAQccEA8++GA899xzMW7cuAJ9BoDqVsx7p02bNtGmTZt1ztl9992r9L6BmlPMeweonYp97/Tr1y+uvPLKaNeuXeywww5x3XXXxRdffBGnnHJKgT4DbCoC3oyYM2dO9O3bNyK+vmO2ZcuWsfvuu8edd94ZZWVl6/24oUOHxsqVK+O2226LJUuWRM+ePeOYY46JiRMnrrO/cePGMXjw4Bg3blw8++yzMXny5Hjsscfi3HPPjbFjx0bXrl3X+XGnn356NG3aNO6555646aabYvvtt4/hw4evPjOQLcW+c3r06BGXX355XH/99XH//fdHu3bt4rrrros99tij6m8eqBHF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GyZ7WNsOO+xQ00dgEystLa3yjJdeeqkAJ6EmVWant2rVKtnz6quv5q2ndj5QNW3bts1bnzBhQvUcJCKuvfbavPVHH320mk4CxeWCCy7IW//Vr36VnLF8+fJkz5QpU/LWzznnnOSMzz//PNmT0qBBg2RPnz59kj2V+XtJSUlJ3vqIESOSMyZNmpTsofLcwQsAAAAAkFECXgAAAACAjBLwAgAAAABklIAXAAAAACCjBLwAAAAAABkl4AUAAAAAyCgBLwAAAABARgl4AQAAAAAyql5NH4B1W7p0abJn8ODByZ45c+bkrY8ePTo549FHHwtltdoAACAASURBVE32zJ49O9lz3XXX5a3ncrnkDKiN9thjj7z1gw8+uCDXOfzww/PWH3/88YJcB9h0Zs2aVdNHqLWaNGmS7DnooIOSPf37989b79OnT6XPlM/FF1+ct/7pp58W5DrAuqX2QceOHQtynUceeSTZc/XVVxfkWpAlzZo1S/YMGTIkb70yGcSUKVOSPUcccUSypxB22mmnvPU77rgjOaNLly4FOcv48ePz1i+//PKCXIfKcwcvAAAAAEBGCXgBAAAAADJKwAsAAAAAkFECXgAAAACAjBLwAgAAAABklIAXAAAAACCjBLwAAAAAABlVr6YPwMZ74403kj3HHnts3vqtt96anDFgwICC9Gy11VZ562PHjk3OeO+995I9kDVXXXVV3npJSUlyxuOPP16QHjZOnTr5/720oqKimk5Cbde8efOaPsJqZWVlyZ7U/jrggAOSM9q0aZPsqV+/ft76T37yk+SM1O/jiIjPP/882TNjxoy89S+//DI5o1699Jfof//735M9wMY54ogjkj2XXXZZla/z5JNPJnsGDRqU7Pnss8+qfBbImtSf/RERLVq0qPJ1TjvttGTPNttsk7d+3HHHJWccdthhyZ7ddtstb71x48bJGblcriA948aNy1tfunRpcgaF5Q5eAAAAAICMEvACAAAAAGSUgBcAAAAAIKMEvAAAAAAAGSXgBQAAAADIKAEvAAAAAEBGCXgBAAAAADJKwAsAAAAAkFH1avoAbFoTJ07MW3/ttdeSM6666qpkT+/evZM9l156ad76jjvumJxxySWXJHveeeedZA9Ul0MOOSTZ06lTp7z1XC6XnPHAAw9U+kwUXkVFRd56Zf4/fO655wp1HIrU559/nuxJ/bdy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165x/PHHx/Tp09fove+++6K0tDQWLlxY6fm9evWKiy66KCIili9fHiNGjIhHHnlkg885ceLEOOyww6JTp07Rp0+fuPbaa2P58uUbPAeoWVnZOau89NJLseuuu27QGYDikoW9k8vlYsyYMXHggQdGWVlZHHXUUfHUU09t0AygeGRh7/w7X+9A9mVt7+RyuRg4cGAMGDBgo2dQferV9AGonM6dO8c555wTERErVqyIDz74IO6666447rjjYuTIkXHIIYdERETPnj3j7rvvjiZNmlR69qhRo1b3f/DBB3H77bfHnnvuuUHnu+++++JXv/pVHHfccfHLX/4y5s6dG9dcc018/PHHMXz48A2aBdS8Yt85q8ybNy9OOumkWLly5UZ9PFA8in3v3HLLLfG73/0uTj/99Nhtt91i8uTJccIJJ8Sdd94ZHTt23KBZQHEo9r2ziq93oPbIyt6JiLjnnntixowZUV5evtEzqD4C3oxo0qRJdOrUaY3XDjrooBg0aFAMHz489t9//2jatGk0b948mjdvvkGzd9111yqf75ZbbolDDz109aLad999Y+XKlTFy5Mg4++yzY6uttqryNYDqU+w7p6KiIiZMmBC//e1vo04d34wCtUEx752KiooYM2ZM9OvXL0444YSIiNhnn31i5syZcffddwt4IaOKee9E+HoHaqNi3zur/Otf/4orrrgittlmm4LNZNPyp0SG1alTJ4YMGRKLFy+Ov/zlLxGx9m38FRUVMWrUqOjevXuUlZXFqaeeGmPGjInS0tLVc1bdxr9gwYLo3bt3REScfvrpq2/DXzVzxowZ6zxHRUVFdOvWLY444og1Xm/Xrl3kcrl49913C/7egepXLDsnImLu3Llx8cUXR//+/eOss87aVG8ZqGHFsndKSkri1ltvjcGDB6/xWr169TyOCmqZYtk7Eb7egc1FMe2dVYYPHx4HHnhg7L777oV+u2wiAt6MKy8vj7p168azzz67zvrvf//7uPHGG+OYY46Ja665JiIirrzyynX2brPNNjFq1KiIiDjjjDNi2LBhEfF/3xrQoUOHdX5cnTp14txzz4399ttvjdcfffTR2HLLLWP77bffqPcGFJ9i2DkREdtuu208/PDD8fOf/zzq1fPNKFCbFcPeKSkpie9+97vRqlWryOVy8f7778fll18eb7/9dhx11FFVfYtAkSmG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\n",
      "text/plain": [
       "<Figure size 1440x576 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(ncols=5, nrows=2, figsize=(20, 8))\n",
    "axes = axes.flatten()\n",
    "for i, ax in enumerate(axes):\n",
    "    ax.imshow(X_train[i], cmap='gray')\n",
    "    ax.axis('off')\n",
    "    ax.set_title('Digit: {}'.format(y_train[i]), fontsize=16)\n",
    "fig.suptitle('First 10 Digits', fontsize=20)\n",
    "fig.tight_layout()\n",
    "fig.subplots_adjust(top=.9)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Show random image in detail"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:41.135670Z",
     "start_time": "2020-06-21T18:32:39.215789Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxkAAAMpCAYAAABomf5SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde3zOhf//8ee2y5jt2jBGqgn5qE9SSKg+K6fYCAvJ5CwTOWfyIYfxSZZ0cspHamJOhYohZY4pp1FK+EibnOe02bDNrt8f/VzfluO1vff2vtbjfrv54zrs/Xi/7dq163W93+9rHg6HwyEAAAAAMIjn7V4BAAAAAIULQwYAAAAAQzFkAAAAADAUQwYAAAAAQzFkAAAAADAUQwYAoMDxQYYA8PfCkAEAfzMdO3ZU1apVnf/++c9/qk6dOurRo4c2b96c676LFy9W1apVdfr06VtefoMGDRQdHS1JyszM1Lhx4/TNN9+4vJ6ffvqpmjVrpho1aqhFixaKj493eRkAgNvDdrtXAABgvpo1a2ro0KGSpOzsbJ04cULz589X165dNXHiRDVv3lyS9NRTT2nBggXy9/e/5WVPnjzZef8TJ07ok08+0SOPPOLS+i1fvlzDhw9Xly5d9OSTTyohIUEDBw6Uj4+P6tev79KyAADmY8gAgL8hf39/Pfzww7mua9q0qTp37qzRo0frX//6lwICAlSqVCmVKlXKpWX/85//zPf6LVmyRI888oiGDRsmSXrsscf0448/av78+QwZAOAGOFwKACBJ8vT0VO/evZWWlqaVK1dKuvpwqZycHE2ePFkhISF66KGH1LdvX3388ceqWrWqczlXDpf6/fff1bBhQ0lS//791bFjx1zL/P7776+7LpmZmfLz88t1XYkSJXTu3DlDtxkAUDAYMgAATo8++qi8vLyUmJh4zdvfeecdTZ8+XREREXrvvfckSW+99dY17xsUFKTJkydLkgYNGqRRo0ZJ+r9DsB544IHrrkdERIQ2bdqkFStWKC0tTfHx8Vq/fr2aNWuWn80DAJiEw6UAAE5eXl4qUaKEUlJSrrrt/Pnz+uijjxQZGalevXpJkkJCQtSyZUvt3bv3qvt7e3vr/vvvlyRVqFBB9957ryTd0iFYjRo1UqtWrTRgwADndW3btnXuDQEAWBtDBgDgluzatUuZmZlq1KiR8zoPDw89/fTT1xwy8uPVV1/V6tWrNXjwYD388MP64YcfNGXKFNntducJ6wAA62LIAAA4Xbp0SefOnVPZsmWvuu3MmTOSdNVeiNKlSxu6DkePHtWXX36pIUOGqEePHpL+OIzL19dXY8aMUfv27RUcHGxoEwBgLM7JAAA4bdu2TdnZ2apVq9ZVtwUFBUnSVX8zw5W/oXErjh07JklXffpVrVq15HA4dODAAUN7AADjMWQAACT98Ve5Z8yYoRIlSujpp5++6vb7779fvr6+V/1hvTVr1lx3mV5eXi6vR3BwsDw9PbVjx45c1+/atUuSdNddd7m8TACAuThcCgD+hlJTU7Vz505Jf/wxvuPHj2vRokXaunWrJk6ceNXHx0qS3W5X586d9cEHHzhP6v7888/1008/ycPD45odu90uSfr22291zz336L777tPp06eVnJyse++995qdwMBAtW/f3vnJVA899JB+/vlnvf/++2rSpImqVKli1H8DAKCAMGQAwN/Qjh071K5dO0lSkSJFVKZMGT344IOaN2+eHnrooet+3csvv6zLly8rNjZW58+f11NPPaWIiAgtWbLkmvf38/PTiy++qDlz5igxMVFffvml1q5dq2HDhmn27NmqU6fONb9u+PDhKlOmjObPn6/3339fd955p1588UV17949/xsPAChwHg6Hw3G7VwIAYH2ZmZmKj4/XE088ketk78GDB+vXX3+97qABAPj7YU8GAOCWeHt7a+rUqVq0aJF69OghHx8fbd68WfHx8Ro3btztXj0AgIWwJwMAcMsOHjyoiRMnavv27crIyFDFihXVpUsXhYeH3+5VAwBYCEMGAAAAAEPxEbYAAAAADMWQAQAAAMBQppz4XblyZWVnZ5uRAgAAAGACm82mAwcOXPs2M1YgOztbycnJZqQAAAAAmCA4OPi6t3G4FAAAAABDMWQAAAAAMBRDBgAAAABDMWQAAAAAMBRDBgAAAABDMWQAAAAAMBRDBgAAAABDWXbICAwM1KpVq7R+/XrNnz9fPj4+tCzcMrtHi5ZVerTcq2V2jxYtq/RouVfL7F5BtPI0ZOTk5GjkyJFq166dOnbsqKSkpHyvyF+NHDlScXFxCgkJUWJioiIjIw1v0HLfHi1aVunRcq+W2T1atKzSo+VeLbN7BdJy5MGqVascQ4cOdTgcDkdiYqKj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q3nz5oqKinJettlsmjp1qqpVqyZJunz5sooWLar9+/frscceU7FixVSsWDFVrFhRP//8s0uttm3bauzYsbla27dvV3x8vJ588kl1795daWlpkqRPP/1Unp6eatq0aZ63rWzZshoyZMhV1y9YsEChoaEqWbKk/P39NWnSJNlsNp05c0a+vr55+p5dT2H7GbtdPVru1TK7VxCtPA0Zv/zyiy5cuKBu3bqpU6dO2rlzZ75X5K/8/f2d7yylpaUpICDA8AYt9+3RomWVXmFrPf/885o7d64k5XqhmJGRIV9f33wtu2bNmvLy8nJevueee9S6dWsNGTJEpUuX1rJlyyRJXl5eSkhI0IQJE1SzZs08tWrXrp2rlZKSouLFi2vo0KEKDAzU8uXLJUnVqlXL14AhSb6+vvLz89P58+fVs2dPRUVFOQ/F2rp1qz766CP17NlT999/v7777judP39ep0+f1rZt25SRkeFSy8/PT3a7XWlpac6B49FHH1VMTIzWrVunSpUqacyYMdq9e7fmzZun6OjofG1bvXr1ZLPlPrL63Llz+uGHH1S/fn3ndV5eXoqPj9ewYcPyvcfrrwrbz9jt6tFyr5bZvYJo5WnIKFasmLp3764PP/xQY8aM0SuvvKLs7Ox8r8yfpaamym63S5LsdrvzGNCCQMv9erRoWaVXmFq+vr66++67tWvXLkl/HM9/RfHixZWenm5or0aNGqpQoYIk6eGHH1ZycrLztvr16ysmJkb79+/X3r17893y8/NzDiw1atTQwYMH873MPzt8+LDatm2rNm3aKDw8XJL0+eefa9iwYZo9e7YCAwNVpUoVde3aVS+88IKio6NVo0YNlSpVyuXWoUOH1KBBA73wwguKiIhQeHi4atWqJUkKDw/Xzp07NXv2bB0+fFgNGzZUbGys3n77bee7lPm1efNm/etf/8o1xElSWFiYZs6cqZ9//lk//vijIS2pcP2M3c4eLfdqmd0riFaehoyKFSuqRYsW8vDwUMWKFVWiRAmdPHky3yvzZ5s2bVJYWJgkKTQ0VBs2bDB0+bTcu0eLllV6han14IMPKjEx0Xn5wIEDzpOua9eurd27dxvae/fdd50v9n/55RdVqFBBx44d07Rp0+RwOOTl5aUiRYoYcuhNlSpVnMPT3r17deedd+Z7mVecPHlSERER+ve//63nn39ekvTZZ5/p448/1qJFi5yD1KlTp3T69GktXbpU0dHROnr0qO677z6XWsePH1eTJk30xhtvqFu3bpKkpk2basuWLZKkb775RjVr1lRMTIy+++47JSQkqHPnzho4cGC+Dpv6sx9++CHXHqbDhw8rJiZGDodDNptNNptNnp7GfXhlYfoZu509Wu7VMrtXEC0PRx7OzoqLi9O+ffs0evRoHT9+XJ07d9ayZcuu2qV6RYUKFXK9Q3UrgoKCFBsbK7vdrpSUFEVERLi8W5mWeS2ze7RoWaXnLq2nn376pvdp06aNLl++rCVLlkiS7rzzTg0YMEA2m02HDh3SO++8k2vvxvW0bt36urelpKRo5syZevXVV5WcnKx58+bJZrPJ399fL7zwgnx8fPTll1/qp59+kvTH4UzNmze/7vKKFSt23dtOnjypadOmaeTIkUpJSdGsWbN06dIl+fj46KWXXsp1+NfgwYM1fvz4G3661PWOUR45cqS++OIL3XvvvZL+OAfjyiBz5ZCDunXravDgwRo6dKh2796tIkWKaNiwYapbt+51e3fcccdV1/Xv318LFy7MNZyMGzdOUVFR8vb2Vrly5fTBBx/I39/fefvo0aNVrly5G3661JXv+bWcOHFCkyZN0htvvOFch9dffz3X/9/ChQu1Y8cOeXh4qEaNGnruueeuu7wbPT6uxV1+xqzeo+VeLbN7eW0FBwcrKSnpmrflacjIzMzUsGHDdOTIEXl4eOiVV1654XGzeRkyAADGuZUhwyiuvojMjxsNGUYr6JM8/+paQ0ZBudGQYTQzHx8ACtaNhow8/Z0Mb29vvfXWW/laKQAAAACFE3/xGwAAAIChGDIAAAAAGIohAwAAAIChGDIAAAAAGIohAwAAAIChGDIAAAAAGIohAwAAAIChGDIAAAAAGCpPf4wPAMzywAMPmNZq166daa0ePXqY1pKkcuXKmdZyOBymtWCMkiVL3u5VAFDIsCcDAAAAgKEYMgAAAAAYiiEDAAAAgKEYMgAAAAAYiiEDAAAAgKEYMgAAAAAYiiEDAAAAgKEYMgAAAAAYiiEDAAAAgKEsO2QEBgZq1apVWr9+vebPny8fHx9aFm6Z3aNF669KlSqlr7/+WhUrVlSlSpU0e/ZsffLJJxoxYoQ8PY15qjt06JBmzZolSTpx4oRmzpyp//73v/ryyy+Vk5MjSdq2bZumT5+uGTNmaO/evS43srKy1LdvX7Vq1UphYWFatWqV9u3bp5YtW6pFixYaNmyYLl++LEmaO3eumjZtqubNm2v16tV5anXq1EkhISGqU6eOvvjiC+3YsUN33XWX6tevr/r162vBggXO++fk5CgsLEzTp0/Pc+vJJ59U3bp1na27775bDRo0UIMGDZytqVOnqk6dOqpbt66WLVvmcsvs3u1omfE9u2LPnj0aOHCgJGnfvn166aWX1L9/f7333nvOx/2yZcvUq1cv9enTR5s3b85z61oK23PV7erRcq+W2b2CaFl2yBg5cqTi4uIUEhKixMRERUZG0rJwy+weLVp/ZrPZNGrUKF28eFGS1L9/f7377rvq2LGjihUrpvr16+e7sWHDBn3++efKzs6WJH399ddq1KiRXnzxRWVlZemXX35RWlqavvvuO/Xo0UOdOnXS6tWrnfe/VZ999plKliyppUuXas6cORo+fLjGjx+vYcOG6YsvvtCFCxf01Vdf6cSJE/rwww/1+eefKy4uTuPHj9elS5dcas2ZM0elSpXS+vXrFR8fr759+2rHjh0aOHCgEhISlJCQoHbt2jnvP2LECJ0+fdqlxp9bgYGBWrdunZYvX65+/fo5W2vWrNGaNWvUrl07paSkaNq0adq4caNWr16tPn36yOFwWLpndsus75kkzZ8/XxMnTlRmZqYkadKkSerTp4/effdd+fr66ptvvtHp06e1ZMkSvffee5owYYJmzpzpvL8RCtNz1e3s0XKvltm9gmhZdsh44okntHLlSknSihUr1KhRI1oWbpndo0Xrz1555RUtWLBAJ0+elCQNHDhQ27dvl81mU+nSpXXq1Kl8N0qVKqX27ds7Lz///PO65557lJ2drfPnz8vPz0+HDx9WcHCwbDabihUrpsDAQB0/ftylzjPPPKOoqCjnZZvNppkzZ6pu3brKzMzUiRMnVLp0aSUmJqp27doqWrSo/P39dc8992jPnj0utdq2bauxY8fmam3fvl3x8fF68skn1b17d6WlpUmSPv30U3l6eqpp06YuNf7cio6OztXasWOH4uPj9dRTT6lHjx5KS0tzbluRIkV07NgxlShRQh4eHpbumd0y63smSeXLl9eYMWOcl0+ePKlq1apJkqpVq6bdu3drz549qlatmry9veXn56fy5cvr119/zXPzrwrTc9Xt7NFyr5bZvYJoWXbI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rbi4OL388sv67bffFB8fLy8vL3l7e6t169by9/fXoUOHtGbNGnXu3Pm6y7li+fLlN71Pr169VKNGDXl4eOi///2vRo4cqePHj+v8+fOSpF27dumjjz666XKu7Lm6nnPnzik+Pl7t27eX9Mferx9++MH56WAHDhzQli1b5OXlJV9fXzVu3Fje3t7XXd7Bgwdv2CtWrJhefvll58/ZsmXLdODAAfXu3Vs2m02///67pk6deksD/aZNm254+7hx49SqVatch8m1b99eFy9e1JAhQ3TixIlb/nQpVz+AwV2eF63eo+VeLbN7eW0FBwcrKSnpmrdZdsgAYF15Odcgr643ZBSE6w0ZBaEgfzFdi1GHN92KGw0ZRruVIcMoNxsyjHazIcNINxsyjJTXT3kDYD03GjIse7gUAAAAAPfEkAEAAADAUAwZAAAAAAzFkAEAAADAUAwZAAAAAAzFkAEAAADAUAwZAAAAAAzFkAEAAADAUAwZAAAAAAzFX/wG4LKcnBzTWiY8RTnFxMSY1po7d65pLUnavXu3qT0AQOHHX/wGAAAAYBqGDAAAAACGYsgAAAAAYCiGDAAAAACGYsgAAAAAYCiGDAAAAACGYsgAAAAAYCiGDAAAAACGYsgAAAAAYCjLDhmBgYFatWqV1q9fr/nz58vHx4eWhVtm92hZs5WVlaVOnTopJCREderU0RdffKEdO3borrvuUv369VW/fn0tWLDAef+cnByFhYVp+vTpeW49+eSTqlu3rrN19913q0GDBmrQoIGzNXXqVNWpU0d169bVsmXL8rx9ycnJmjFjhiTp+PHjmj59uqZPn66lS5c6/wr6F198offff18zZszQjBkzdPHixTz3rihVqpRWr16tihUrOq8LCwvTnDlz8r3s63H3x6JVerRoWaVHy71aZvcKomXZIWPkyJGKi4tTSEiIEhMTFRkZScvCLbN7tKzZmjNnjkqVKqX169crPj5effv21Y4dOzRw4EAlJCQoISFB7dq1c95/xIgROn36dJ5bgYGBWrdunZYvX65+/fo5W2vWrNGaNWvUrl07paSkaNq0adq4caNWr16tPn36yOFwuNxbt26dFi9erOzsbEnSV199pSZNmqhXr17KysrSnj17JElHjhxRt27d1LNnT/Xs2VPFihXL0/ZdYbPZNHLkyFzDStWqVRUeHp6v5d6Muz8WrdKj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bt6fu3271K177W9677332LhxY5E962PHjmXWrFkUFBTQoEEDQkNDsbOzY8OGDURHRwPwyiuvMHjw4Du27jSAvPPOO3z55ZfGb3eCG58rqVChAmlpafj6+vLf//4XuPHtUkuWLKGwsJBRo0bRo0eP2y7z5l6+/xUUFPSnxzEiIoJ33nkHR0dHatSoYXwcw8PDSUpKwsbGBg8PD0JDQ++4bq+//vodfwZQrlw5/P39qVKlCvb29iQmJnLy5EmGDBnCtWvXuHDhAosWLbqvb4j57LPP7nmbW5WF11hpb1m7p1bZalm7V9xW3bp173hKq8lDxo8//khERAQODg64ubkRERFR5PzW2ynOkCEi8iC7nyHDnG43ZFjK7YYMSynOUY7iutOQYSn3GjLMydQhQ0QE7j5k3Nffyahduzbx8fEAPP7448TFxZnv3omIiIiIyANFf/FbRERERETMSkOGiIiIiIiYlYYMERERERExKw0ZIiIiIiJiVhoyRERERETErDRkiIiIiIiIWWnIEBERERERs9KQISIiIiIiZnVff4xPRETMa9q0aX/1XbCYIUOGWK3VqVMnq7VmzpxptRaAr6+v1Vr6i98iYm46kiEiIiIiImalIUNERERERMxKQ4aIiIiIiJiVhgwRERERETErDRkiIiIiImJWGjJERERERMSsNGSIiIiIiIhZacgQERERERGz0pAhIiIiIiJmVWqHDFdXVzZs2MC2bRFWYTMAACAASURBVNuIi4ujQoUKapXilrV7aqlVWnqWav3yyy+MHTsWgKNHjxIUFMSoUaOYO3cuhYWFxtsVFhYSEhJCQkKCyY2CggIGDhxIu3btaN26NWvWrCE1NZXatWvTvn172rdvz8qVK4u0unbtyscff1zyFQSqVq3K+vXrqV+/Po8++ijR0dF8+umnTJ48GRsbG7M0Tp06RVxcnPHyr7/+yrp164yXz58/T3x8PHFxcXz22WdcvnzZ5MbNx/Gll16iTZs2xsexTp06dOjQgQ4dOhgfxwULFtC6dWvatGlT5H6YyhrPj7t5EF5jf3XL2j21ylbL2j1LtErtkDFp0iRiY2Np164de/fuxc/PT61S3LJ2Ty21SkvPEq3PPvuMefPmUVBQAMDy5cvx9vZm7ty5FBQUsHv3buNto6Ojyc7OLlYnJiaGatWqsW3bNhITExk5ciSpqakEBweTkpJCSkoKXl5extuHhIRw7ty5kq3c/8/e3p6QkBDy8/MB8PPzY/HixQwZMgRHR0defPHFEjd2797Nhg0buH79OgDJycls374dg8FgvM3GjRtp27Ytr7/+Ok8//TTnz583uRMTE4Orqytbt24lISGBwMBA4+OYnJxMcnIyXl5eZGVlsXDhQnbs2MGmTZsICAgocl/ul7WeH3dT1l9jpaFl7Z5aZatl7Z4lWqV2yGjbti1JSUkArF+/nk6dOqlVilvW7qmlVmnpWaL18MMPExoaarzcsGFDsrOzMRgM5OXlYW9vD8D27duxsbHhueeeK1bH09OTiIgI42V7e3u+//57EhMT+f/Yu/e4qAr8/+MvmAEhHEAxJTU1tM2+/rLNW37LVfMW3iVSdrHsq2JSqIil5o0UXeWSt1pvpRZmami1a4moCRpa5rfA3exiq65omBcsdURQlPn94cP5ZisYMHMcZt/Pv5wZPK85cw6H+cycgU6dOjF8+HD7E9QNGzbg6elJaGhoFdbs/8TFxbFhwwZOnz4NwIEDB/D39wfAz8+PK1euVLkRGBhI//797Zfr169/w/YpKSnh4sWLHDp0iHXr1nH8+HGCg4Mr3Bk4cCAJCQn2y2azmZycHNLT0+ncuTNRUVFYrVbq1KlDbm4uXl5enDhxgsDAwEq9Y2PU/lGe6v495goto3tqVa+W0T1ntFx2yPD39+fcuXMAWK1WAgIC1HLhltE9tdRylZ4zWh06dMBkMtkv169fnyVLljBixAjOnj1Ly5YtOXLkCFlZWQwZMqTSnZo1a2KxWLBarfaBo127diQnJ7Nz505CQkKYMWMG+/fvZ+3atTc8ka6Kvn378vPPP/PZZ5/Zrzt69CgTJkzg/fffp3bt2nzxxRdV7vzud7/D0/P/fsw1b978htuLi4s5c+YMjRs3JiIiguLiYr7++usKd375OA4aNIiEhATatm1LUlISO3bsICQkxP7Ymc1mFi1axCOPPEJ4eHil1suo/aM81f17zBVaRvfUql4to3vOaJmrvAQnOX/+PBaLheLiYiwWC2fPnlXLhVtG99RSy1V6RrSWLl3KK6+8QpMmTdi4cSOvv/46Pj4+nDlzhokTJ3Ly5Em8vLyoV69ehV+1PnbsGE888QTPPfcckZGRnD17lsDAQADCwsIYM2YMq1atIj8/n65du3LkyBG8vb1p0qRJpd/VGDBgADabjYcffpj77ruPmTNnct999/HHP/6Rw4cPM2jQIMaNG0diYmKllv9b+fj44O3tTaNGjYBr7wgcOXKEBx54oMLLOnbsGOHh4URHR//b4zhgwABiY2PtXxsTE8OIESPo3bs3WVlZPPbYY1VaD2fuH2Vxt++x29EyuqdW9WoZ3XNGy2Xfydi9eze9evUCoGfPnmRnZ6vlwi2je2qp5So9I1oWiwU/Pz/g2ofzLly4QFRUFAsXLiQlJYXu3bvzxBNPVPgJ5MmTJ3n88cdJTExk2LBhAISGhtrP6d++fTutWrUiOTmZPXv2kJWVxTPPPENcXFyVTpsaPnw4UVFRjBgxggMHDjBt2jR++OEHCgsLATh9+rT91Cln8vLyolatWvzwww8A/PDDD9SpU6fCyzl58iShoaHMmTPH/jj27NnT/jhmZmbSqlUrDhw4QHh4ODabDS8vL7y9vW94p6WynLV/lMfdvsduR8vonlrVq2V0zxktD1tlPnVWQY0bN+bo0aMV+j9169YlNTUVi8VCQUEBkZGRXLx40Sn3T63q11NLLVfpVbZ1/dzXspw4cYLExEQWLFjA/v37WblyJSaTCbPZTGxs7A2fHXj77bepXbs2vXv3LnN5PXr0+LfrYmNjSUtLu+E0olmzZjFhwgS8vb0JDg5m2bJlNzzhnz59OsHBwURHR5fZatWqVbnr9ktvvPEGf/7znwkMDCQ2NparV69SUlJCQkICP/744y3//63OGz537hwfffQRgwcPBq6dlvX3v/+dvn37AnDq1Cm2b99OaWkpAQEB9OzZ84ZTkX4pKSnpptePHTv23x7HmTNnMnHiRLy9valXr579cUxISCAjIwMPDw9CQ0Nv+GzFr23btq3M2xy9f1R0aKwO32Ou3jK6p1b1ahndq2yrUaNG5OXl3fQ2lx0yRETc2a2GDEe72ZDhLBUZMqrK2R+8/KWyhgxnKW/IcDRHfaBfRP6zlDdkuOzpUiIiIiIiUj1pyBAREREREYfSkCEiIiIiIg6lIUNERERERBxKQ4aIiIiIiDiUhgwREREREXEoDRkiIiIiIuJQGjJERERERMShNGSIiIiIiIhDacgQERERERGHMt/uOyAi4irCw8MNa/Xo0cOwFsC2bdsMax04cMCwlo+Pj2EtDw8Pw1q3oyci4kh6J0NERERERBxKQ4aIiIiIiDiUhgwREREREXEoDRkiIiIiIuJQGjJERERERMShNGSIiIiIiIhDacgQERERERGH0pAhIiIiIiIO5bJ/jC8oKIg1a9bg6+vL8ePHGTp0KEVFRWq5aMvonlpq3a6eyWRi1KhR1K1bl9LSUpYsWYKnpycjR47Ew8ODI0eOsHLlSkpLSyu1/JKSEoYPH86RI0e4dOkSU6ZMoWHDhvTr1497770XgOjoaCIiIgAoLS2lT58+9OvXj+jo6Eo1v/vuO1asWEFKSgqHDh3i1VdfxWQy0aBBA+Li4vD09GTx4sV8/fXX3HHHHQBMnz4dPz+/SvV+rXHjxrzxxht4eHhw9OhRRo0a5fD9IzU1lQsXLgBw/PhxatSoQVBQEAB33XUX+/fvJz4+vlLL/k/cZu56/HCnY5Va1btldM8ZLZd9JyM+Pp41a9bQsWNHcnNzGTlypFou3DK6p5Zat6vXqlUrTCYTU6ZMYf369URGRhIZGcmaNWuYOnUqNWrUoE2bNpVe/urVq6lduzaffPIJ6enpjB49mpycHOLi4sjKyiIrK8v+ZBVg6tSp/PTTT5XupaWlMX/+fC5fvmzvDx48mHnz5lFSUsLevXsBOHjwILNnzyYlJYWUlBSHPVkFmD17NsuXL6d79+5kZ2czZswYhy0bwNvbG4CYmBhiYmL485//THx8PDExMbz00ktYrVYWLlxY6eX/J24zdz1+uNOxSq3q3TK654yWyw4ZHTp0ICMjA4DNmzfTrVs3tVy4ZXRPLbVuV+/48eOYTCY8PDzw9fXl6tWrvPLKK3z77beYzWYCAwM5d+5cpZc/cOBAZs6cab9sNpv58ssvSU9Pp1OnTgwfPhyr1QrAhg0b8PT0JDQ0tNK9u+6664ZX8Js2bYrVasVms1FUVITJZKK0tJT8/HwWLlxIXFwcW7ZsqXTvZpo3b87WrVsB+Oyzz3jkkUccuvxmzZpRo0YNFixYwGuvvUaLFi3st0VFRbFhwwbOnDlT6eX/J24zdz1+uNOxSq3q3TK654yWyw4Z/v7+9h/UVquVgIAAtVy4ZXRPLbVuV6+4uJg777yThQsXEh0dTXp6OqWlpdSpU4f58+fj7+9Pfn5+pZdfs2ZNLBYLVqvV/uS1Xbt2JCcns3PnTkJCQpgxYwb79+9n7dq1JCQkVGl9/vCHP2AymeyXGzRowOLFi4mKiuLnn3/mwQcfpLi4mP79+zNhwgT+/Oc/8+GHH3L48OEqdX/pH//4B7179wagd+/e9tN7HOXSpUusWbOGsWPHkpyczPTp0zGZTNSqVYs2bdqwadOmKi3/P3Gbuevxw52OVWpV75bRPWe0XHbIOH/+PBaLBQCLxcLZs2fVcuGW0T211LpdvT59+rBv3z7GjBnDiy++yKhRo/Dy8qKgoIDRo0ezdetW/ud//qdKjWPHjtGlSxeeeuopIiMjCQsLo3Xr1gCEhYWxb98+Vq1aRX5+Pl27diU1NZX58+fbX4WqiiVLljB37lxWrFhBt27deP3116lRowYDBgzAx8eHO+64g9///vcOfcI6adIkevfuzd/+9jdKS0ur9K7CzRw9etT+Sv6xY8c4f/48QUFBPPbYY2zdurXSn5/5pf+0beauxw93OlapVb1bRvec0XLZIWP37t306tULgJ49e5Kdna2WC7eM7qml1u3qFRYWcvHiRQAuXLiAyWTipZdeIjg4GICioqIqPWk9efIkjz/+OImJiQwbNgyA0NBQ+3n227dvp1WrViQnJ7Nnzx6ysrJ45plniIuLq9IpONdZLBb7OwlBQUFYrVby8/MZN24cV69e5cqVK+zfv59mzZpVuXVdly5dmD17Nv3796e0tJTMzEyHLRuuDYajR48GoE6dOvj5+XHmzBnatm3LZ599VuXl/yduM3c9frjTsUqt6t0yuueMlofNZrNVeSm30LhxY44ePVqh/1O3bl1SU1OxWCwUFBQQGRlp/8HuaGpVv55aajmjFx4efsuv8fHx4fnnn6dWrVqYzWY2bdrE6dOnefrpp7ly5QqXLl1iyZIlt3wVaP369Te9PjY2lrS0NJo3b26/btasWUyYMAFvb2+Cg4NZtmwZ/v7+9tunT59OcHBwub+paNu2bWXeduLECebMmcPChQvZv38/K1aswGQyYTabGTt2LMHBwaSlpZGdnY3JZKJbt2706dOnzOUNGDCgvFX/N23btmX+/PlcunSJb7/9lrFjx3LlypXf9H8ffPDBW36N2Wxm2rRp1KtXD5vNxuLFi/nqq6945513GDlypP23Tt3Kp59+etPr3WGbPf744+Wt+r9x1+NHdTlWqeX+LaN7lW01atSIvLy8m97mskOGiIjRfsuQ4ShlDRnOUt4TVker6JBRFb9lyHCUsoYMZzFym1V0yBARgfKHDJc9XUpERERERKonDRkiIiIiIuJQGjJERERERMShNGSIiIiIiIhDacgQERERERGH0pAhIiIiIiIOpSFDREREREQcSkOGiIiIiIg4lIYMERERERFxKA0ZIiIiIiLiUObbfQdERFzFiy++aFjLZrMZ1gJ47bXXDGsVFRUZ1jpy5IhhLaO3mdE9ERFH0jsZIiIiIiLiUBoyRERERETEoTRkiIiIiIiIQ2nIEBERERERh9KQISIiIiIiDqUhQ0REREREHEpDhoiIiIiIOJSGDBERERERcSgNGSIiIiIi4lAuO2QEBQWxZcsWPvnkE9atW4evr69aLtwyuqeWWrej9/XXX/P8888DcODAAYYNG0Z0dDRz586ltLQUgLfffpshQ4bw3HPPsWvXrgo3SkpKGDJkCJ06daJ9+/Zs3LiRnJwc7r77brp06UKXLl149913AVi8eDEPP/ww7du356OPPqrSunXt2pXZs2cze/ZsUlJSeO+99wgICGDKlCnMmTOHpKQkgoODq9QoizP3D7PZzGuvvcZf//pX0tPT6dGjh/22sLAwPvzwwyo3bsc2++677xg/fjwAhw4dYuzYsYwbN4558+bZ90WA0tJSpk6dyqZNm6q2kr/irscPdzlWqVX9W0b3nNFy2SEjPj6eNWvW0LFjR3Jzcxk5cqRaLtwyuqeWWkb3Vq9ezezZs7l8+TIAiYmJjB07lqVLl1KzZk22bt3KwYMH2bp1K2+88QYLFizgjTfeoLi4uMKdoKAgdu7cyaZNmxgzZgw5OTnExcWRmZlJZmYmERERFBQUsGTJEnbt2sW2bduIiYnBZrNVev22b9/O5MmTmTx5MocOHeL1119n6NCh7Ny5k0mTJrF69WoaNmxY6eWXx5n7R3h4OD///DMDBgxg8ODBzJ49G4AWLVrwpz/9CQ8Pjyo3jN5m69evZ8GCBZSUlADwzjvvEBkZybx58ygpKWHv3r32r01NTcVqtVZ5HX/NXY8f7nCsUss9Wkb3nNFy2SGjQ4cOZGRkALB582a6deumlgu3jO6ppZbRvQYNGpCYmGi/fOrUKVq2bAlAy5Yt+fvf/86RI0do1aoVNWrUoEaNGtx9990cPHiwQp2BAweSkJBgv2w2m8nJySE9PZ3OnTsTFRWF1WqlTp065Obm4uXlxYkTJwgMDHTIE+ZmzZrRqFEjtmzZwv33309QUBAzZ86kc+fOfPXVV1Ve/s04c//48MMPSUpKsl++cuUKtWrVYsqUKcTHxzukYfQ2u+uuu5g2bZr9ctOmTbFardhsNi5evIjZbAYgOzsbDw8P2rRpU/WV/BV3PX64w7FKLfdoGd1zRstlhwx/f3/OnTsHgNVqJSAgQC0XbhndU0sto3uPPfaY/ckbQP369cnJyQFg165dFBcX06xZM3JzcyksLOTcuXN89dVXFBUVVahTs2ZNLBYLVquVQYMGkZCQQNu2bUlKSmLHjh2EhITYn9CazWYWLVrEI488Qnh4eJXXEa49YV67di0AdevW5cKFC0ybNo3Tp0/z5JNPOqTxa87cPy5evEhhYSF+fn688cYbJCcnM2/ePF5++WUuXLjgkIbR26xDhw6YTCb75fr167NkyRJGjBjB2bNnadmyJUeOHCErK4shQ4Y4ZB1/zV2PH+5wrFLLPVpG95zRctkh4/z581gsFgAsFgtnz55Vy4VbRvfUUut296ZOncqqVat44YUXqFWrFgEBATRp0oQnn3yScePG8eqrr9KiRQsCAwMrvOxjx47RtWtXBg8eTGRkJGFhYbRu3RqAAQMGsG/fPvvXxsTEkJ+fT3Z2NllZWVVaJz8/Pxo2bGh/x8JqtdpPvdm7dy/NmjWr0vLL4uztVb9+fd577z02bNjA4cOHueeee0hMTGTp0qX87ne/u+FdiMq6XdsMYOnSpbzyyissX76crl278vrrr/Pxxx9z5swZJk6cyLZt23j//ff54osvqty6zl2PH+54rFKreraM7jmj5bJDxu7du+nVqxcAPXv2JDs7Wy0XbhndU0ut29379NNPmTJlCnPnzuXcuXO0a9eOn3/+mXPnzrFs2TLi4uI4efIkISEhFVruyZMnCQ0NZc6cOQwbNsy+Dtef7GdmZtKqVSsOHDhAeHg4NpsNLy8vvL298fSs2iG9RYsW/P3vf7df/uabb+yn2rRo0YKjR49Wafllceb2qlOnDuvWrWPWrFmsW7eOffv20blzZ8LDw4mOjub777+v8mlTt3ObwbUnBH5+fsC1D29euHCBqKgoFi5cSEpKCt27d+eJJ55w6GlT7nr8cMdjlVrVs2V0zxktD1tVPin4GzVu3LjCP5zq1q1LamoqFouFgoICIiMjuXjxolPun1rVr6eWWs7offbZZ+Xe/uOPPzJt2jSWL19OdnY2b7zxBjVq1KB169ZER0djs9lISkri+++/x2w289xzz/HQQw/ddFnt2rW76fVjx44lLS2N5s2b26+bOXMmEydOxNvbm3r16rFs2TL8/f1JSEggIyMDDw8PQkNDbzhP/9f69+9/y/UPCwvj6tWrbNy4EYA777yT0aNH4+Pjw8WLF0lJSaGwsPCWy6nob02qyv5xq994NXPmTPr163fDZ2MGDx5McXExDRs2ZOnSpfTp0+c3tfLz8296vbO22bZt28q87cSJEyQmJrJgwQL279/PypUrMZlMmM1mYmNjb3hc3n77bWrXrk3v3r3LXF5oaGh5q/5v3PX4UV2OVWq5f8voXmVbjRo1Ii8v76a3ueyQISJitFsNGY5U1pDhLL9lyHCUqv463Ypw1q/VvZmyhgxnKW/IcLSKDhkiIlD+kOGyp0uJiIiIiEj1pCFDREREREQcSkOGiIiIiIg4lIYMERERERFxKA0ZIiIiIiLiUBoyRERERETEoTRkiIiIiIiIQ2nIEBERERERh9KQISIiIiIiDmW+3XdARMRV+Pj43O674DRG/hVuI/Xu3ft23wUREbkJvZMhIiIiIiIOpSFDREREREQcSkOGiIiIiIg4lIYMERERERFxKA0ZIiIiIiLiUBoyRERERETEoTRkiIiIiIiIQ2nIEBERERERh9KQISIiIiIiDuWyf/E7KCiINWvW4Ovry/Hjxxk6dChFRUVquWjL6J5aahnZKykpYcaMGRw/fpzLly8TFRVFSEgIL7/8Mh4eHjRt2pRJkybxz3/+k5SUFPv/++qrr5g3bx6PPvpohVrDhw8nLy+PS5cuMXnyZBo2bEj//v259957ARg5ciQREREsXryY1NRUPDw8mDp1Kn369Kn0Ov6au+wfZrOZoUOHUqdOHYqLi3nnnXfw8fHh6aefpqSkhGPHjrFu3TpsNlulG7djm3333XesWLGClJQUDh06xGuvvYanpycNGzZk7NixeHpeew2xtLSU+Ph4/vu//9uhfx3dXfaP29kyuqdW9WoZ3XNGy2XfyYiPj2fNmjV07NiR3NxcRo4cqZYLt4zuqaWWkb309HQCAgJYuXIlf/nLX0hKSmLu3LnExMSwcuVKbDYbO3bs4L777mP58uUsX76ciIgIunTpUqEBA2D16tUEBQWxc+dONm3axJgxY8jJySEuLo7MzEwyMzOJiIigoKCAJUuWsGvXLrZt20ZMTEyVnij/mrvsH3/4wx8oLi5mzpw5rFmzhsjISIYMGcK6detITk6mqKiIhx9+uEoNo7fZ+vXrWbBgASUlJQC88847REZGMm/ePEpKSti7d6/9a1NTU7FarVVav5txl/3jdraM7qlVvVpG95zRctkho0OHDmRkZACwefNmunXrppYLt4zuqaWWkb3u3bvz/PPP2y+bTCa+/fZbWrduDcCjjz7K559/br+9qKiIJUuWMGHChAq3Bg4cSEJCgv2y2WwmJyeH9PR0OnfuTFRUFFarlTp16pCbm4uXlxcnTpwgMDAQDw+PKqzljdxl/6hfvz779+8H4OTJk9x1113UqlWLQ4cOAXDw4EGaNWtWpYbR2+yuu+5i2rRp9stNmzbFarVis9m4ePEiZvO1kxSys7Px8PCgTZs2VVq/m3GX/eN2tozuqVW9Wkb3nNFy2SHD39+fc+fOAWC1WgkICFDLhVtG99RSy8jeHXfcgZ+fH4WFhYwfP97+CvT1J4h+fn5cuHDB/vUffPAB3bt3p1atWhVu1axZE4vFgtVqZdCgQSQkJNC2bVuSkpLYsWMHISEh9ie0ZrOZRYsW8cgjjxAeHl6ldfw1d9k/jh07RsuWLQEICQmhVq1aFBQU8Lvf/Q6ABx98kBo1alSpYfQ269ChAyaTyX65fv36LFmyhBEjRnD27FlatmzJkSNHyMrKYsiQIVVat7K4y/5xO1tG99SqXi2je85oueyQcf78eSwWCwAWi4WzZ8+q5cIto3tqqWV078SJE4wYMYLevXvTs2dP+znvAIWFhfYeXHsVKCwsrNKtY8eO0bVrVwYPHkxkZCRhYWH2d00GDBjAvn377F8bExNDfn4+2dnZZGVlVbr5a+6yf+zatYvi4mLGjx/Pgw8+SF5eHitXrqRXr16MGTMGq9V6w4BYWbdzmy1dupRXXnmF5cuX07VrV15//XU+/vhjzpw5w8SJE9m2bRvvv/8+X3zxRZVb17nL/nE7W0b31KpeLaN7zmi57JCxe/duevXqBUDPnj3Jzs5Wy4VbRvfUUsvI3pkzZ3j++eeJjY1lwIABADRv3tz+pG337t089NBDwLVXgC5fvkxwcHClWidPniQ0NJQ5c+YwbNgw+zpcP88+MzOTVq1aceDAAcLDw7HZbHh5eeHt7X3D4FNV7rJ/NGnSxP6B/JycHE6fPk3Lli158803efXVV/Hz8+Obb76pUuN2bzOLxYKfnx9w7cObFy5cICoqioULF5KSkkL37t154oknHHralLvsH7ezZXRPrerVMrrnjJaHzZGfFCxD48aNOXr0aIX+T926dUlNTcVisVBQUEBkZCQXL150yv1Tq/r11FLLGb3c3NybXp+cnMzWrVtp0qSJ/brx48eTnJxMSUkJISEhTJs2DZPJxNdff83y5cuZP39+ua3rp/D82tixY0lLS6N58+b262bOnMnEiRPx9vamXr16LFu2DH9/fxISEsjIyMDDw4PQ0NAbztP/tV+eXvNbVJf9Y/jw4eXeXrNmTZ599llq1KjBxYsXeeutt2jSpAn9+/fn8uXLHDhwgA8++OA3tV5//fWbXu+sbbZt27Yybztx4gSJiYksWLCA/fv3s3LlSkwmE2azmdjY2BuG3LfffpvatWuX+9ulQkNDy1v1f1Nd9g9XbhndU6t6tYzuVbbVqFEj8vLybnqbyw4ZIiJGK2vIcIayhgxnqeiQUV3cashwpLKGDGcpb8hwtIoOGSIiUP6Q4bKnS4mIiIiISPWkIUNERERERBxKQ4aIiIiIiDiUhgwREREREXEoDRkiIiIiIuJQGjJERERERMShNGSIiIiIiIhDacgQERERERGH0pAhIiIiIiIOZb7dd0BEpDwhISGGte655x7DWuIYtWrVut13wWkyMzNv910QEak0vZMhIiIiIiIOpSFDREREREQcSkOGiIiIiIg4lIYMERERERFxKA0ZIiIiIiLiUBoyRERERETEoTRkiIiIiIiIQ2nIEBERERERh9KQISIiIiIiDuWyQ0ZQUBBbtmzhk08+Yd26dfj6+qrlwi2je2qp9Uuenp4kJiaSlpbG2rVrC162/wAAIABJREFUadSokf22vn37sn79+iotv6SkhGeffZaePXvSpUsX0tPT7betX7+e7t272y+npqbSuXNnunXrRkZGRqVaQ4YMoVOnTrRv356NGzeSk5PD3XffTZcuXejSpQvvvvsuAIsXL+bhhx+mffv2fPTRR1Vax19zl/3jxx9/ZN26dfbL//znP294rH7++WfS0tJYt24d69evp6ioqMKN27HNjh8/ztq1a+2Xv//+ez788EP75SNHjpCamsrbb79NdnZ2pTtlcZf943a2jO6pVb1aRvec0Sp3yCgpKWH8+PFERkby5JNPsn37dvLy8vjT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v59Bgwbh4eFRpeWXx12PH9X9WKWW+7SM7jmj5bJDRocOHcjIyABg8+bN9h9Karlmy+ieWmoZ2evRowcxMTH2yyaTiW+++YY2bdoA8Oijj7Jnzx58fX256667KCoqoqioqFJP8gYOHMjMmTPtl81mM19++SXp6el06tSJ4cOHY7VaAdiwYQOenp6EhoZWaf1uxpnbbOvWrbz00ksANGjQgIKCAh544AH27NkDwI4dO+jQoUOVGv3792fSpEn2y2azmdTUVB555BEuX77MqVOnqFu3rv32wsJCEhMTmTNnToVbffr04cUXX7yhtWjRIlq0aAHAlStXqFGjBnfccQcNGjTg4sWLFBUV4elZtR/B27Zts78L06BBA86cOUNgYCATJky4YR9yBnc9flT3Y5Va7tMyuueMlssOGf7+/pw7dw4Aq9VKQECAWi7cMrqnllpG9u644w78/PwoLCzkxRdftA8c14cIPz8/Lly4AEC9evV44okn+OMf/8if/vSnCrdq1qyJxWLBarXaB4527dqRnJzMzp07CQkJYcaMGezfv5+1a9eSkJBQpXUri7O32dWrV5k7dy4zZswgPT39hoGssLAQi8VSpeX/8nEcOnQokydPxmQycezYMR599FHOnDlDs2bN7F+/evVq+vfvT1BQUIVbfn5+1KxZkwsXLjBy5EhefPFF6tWrB1w7/So1NZURI0YAUL9+fbp27UrPnj0ZOnRoldYRrj2OKSkpxMfHk5GRQWJiIrNmzaKwsLDKyy6Pux4/qvuxSi33aRndc0bLZYeM8+fP23/IWCwWzp49q5YLt4zuqaWW0b0TJ04wYsQI+vTpQ69evW76pHj37t0UFBSwadMmMjIy2LFjB1999VWFW8eOHaNLly489dRTREZGEhYWRuvWrQEICwtj3759rFq1ivz8fLp27Upqairz58+3vwrlCEZssxdeeIHHHnuMxMREfHx87Nf7+flx/vz5Ki8/Pz+f/v37M2jQIJ588kkA7r77bv73f/+XoUOHMnXqVPvXbtiwgaeffrrSrePHjzNo0CCeeOIJwsLCANi4cSOTJk3irbfeIigoiKysLE6dOsXu3bvZs2cPW7ZsITc3t2orCYwfP55u3bqxdOlSmjdvTkJCAgsXLqRZs2Y3rKMjuevxwx2OVWq5R8vonjNaLjtk7N69m169egHQs2dPsrOz1XLh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sWPHEhwcTFpaGtnZ2ZhMJrp161bub3sq67xhZzyOr776arnr/dNPP7Fq1Sr7b5K62XUZGRl89913ANx///08/vjjZS4vLi6u3N6vuev3tLu2jO6pVb1aRvcq22rUqBF5eXk3vc1lhwwREaOVNWQ4g6PPx7+VWw0ZjlTekOFozv7g5S/dashwtIoOGSIiRitvyHDZ06VERERERKR60pAhIiIiIiIOpSFDREREREQcSkOGiIiIiIg4lIYMERERERFxKA0ZIiIiIiLiUBoyRERERETEoTRkiIiIiIiIQ2nIEBERERERh9KQISIiIiIiDmW+3XdARMRV5OTkGNZq2bKlYS2A9957z7CWzWYzrJWdnW1YKz4+3rCWiEh1p3cyRERERETEoTRkiIiIiIiIQ2nIEBERERERh9KQISIiIiIiDqUhQ0REREREHEpDhoiIiIiIOJSGDBERERERcSgNGSIiIiIi4lAaMkRERERExKFcdsgICgpiy5YtfPLJJ6xbtw5fX1+1XLhldE8ttW5H7/DhwyQnJwOQl5fHCy+8QHJyMsnJyezdu5ejR4/aLycnJzNy5Ei++uqrCjVKSkoYMmQInTp1on379mzcuJGcnBzuvvtuunTpQpcuXXj33XcBWLx4MQ8//DDt27fno48+qvD6XG917NiRhx9+2N5q2LAhjz32GI899pi9BVBaWkqvXr1YunRppVtGrNd133zzDbGxsQB8//33REdHM3r0aBYuXEhpaSkA69ev57nnnuO5557jrbfeqnTrl9q0acOmTZsAuO+++9iyZQtbt25l3rx5eHo678euu35Pu2vL6J5a1atldM8ZLZcdMuLj41mzZg0dO3YkNzeXkSNHquXCLaN7aqlldG/z5s289dZblJSUANeGjB49ejBhwgQmTJhAu3btaNSokf3yY489RuvWrXnggQcq1Fm9ejVBQUHs3LmTTZs2MWbMGHJycoiLiyMzM5PMzEwiIiIoKChgyZIl7Nq1i23bthETE4PNZqtwq3bt2nzyySekp6czevRoeysrK4usrCwiIiLsXz916lR++umnCjVux3oBrF27lpSUFC5fvgzAK6+8wqhRo3jttdfw8/Pj448/5vjx42zbto2//OUvLFq0iC+++IJDhw5Vav2ui42N5bXXXsPHxweAl19+mRkzZtCjRw98fX3p1atXlZZfHnf9nnbX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\n",
      "text/plain": [
       "<Figure size 1008x1008 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize = (14, 14)) \n",
    "\n",
    "i = randint(0, len(X_train))\n",
    "img = X_train[i]\n",
    "\n",
    "ax.imshow(img, cmap='gray')\n",
    "ax.set_title('Digit: {}'.format(y_train[i]), fontsize=16)\n",
    "\n",
    "width, height = img.shape\n",
    "thresh = img.max()/2.5\n",
    "for x in range(width):\n",
    "    for y in range(height):\n",
    "        ax.annotate('{:2}'.format(img[x][y]), \n",
    "                    xy=(y,x),\n",
    "                    horizontalalignment='center',\n",
    "                    verticalalignment='center',\n",
    "                    color='white' if img[x][y]<thresh else 'black')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prepare Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Rescale pixel values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We rescale the pixel values to the range [0, 1] to normalize the training data and faciliate the backpropagation process and convert the data to 32 bit floats that reduce memory requirements and computational cost while providing sufficient precision for our use case:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:41.190733Z",
     "start_time": "2020-06-21T18:32:41.137210Z"
    }
   },
   "outputs": [],
   "source": [
    "# rescale [0,255] --> [0,1]\n",
    "X_train = X_train.astype('float32')/255\n",
    "X_test = X_test.astype('float32')/255 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### One-Hot Label Encoding using Keras"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Print first ten labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:41.194165Z",
     "start_time": "2020-06-21T18:32:41.191863Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Integer-valued labels:\n",
      "[5 0 4 1 9 2 1 3 1 4]\n"
     ]
    }
   ],
   "source": [
    "print('Integer-valued labels:')\n",
    "print(y_train[:10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feed-Forward NN"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Model Architecture"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:41.661398Z",
     "start_time": "2020-06-21T18:32:41.195592Z"
    }
   },
   "outputs": [],
   "source": [
    "ffnn = Sequential([\n",
    "    Flatten(input_shape=X_train.shape[1:]),\n",
    "    Dense(512, activation='relu'),\n",
    "    Dropout(0.2),\n",
    "    Dense(512, activation='relu'),\n",
    "    Dropout(0.2),\n",
    "    Dense(10, activation='softmax')\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:41.666776Z",
     "start_time": "2020-06-21T18:32:41.662445Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "flatten (Flatten)            (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 512)               401920    \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 512)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 512)               262656    \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 512)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 10)                5130      \n",
      "=================================================================\n",
      "Total params: 669,706\n",
      "Trainable params: 669,706\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "ffnn.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Compile the Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:41.684739Z",
     "start_time": "2020-06-21T18:32:41.668288Z"
    }
   },
   "outputs": [],
   "source": [
    "ffnn.compile(loss='sparse_categorical_crossentropy', \n",
    "              optimizer='rmsprop', \n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Calculate Baseline Classification Accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:42.224805Z",
     "start_time": "2020-06-21T18:32:41.685759Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy: 8.57%\n"
     ]
    }
   ],
   "source": [
    "# evaluate test accuracy\n",
    "baseline_accuracy = ffnn.evaluate(X_test, y_test, verbose=0)[1]\n",
    "\n",
    "# print test accuracy\n",
    "print(f'Test accuracy: {baseline_accuracy:.2%}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Callback for model persistence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:42.227958Z",
     "start_time": "2020-06-21T18:32:42.225980Z"
    }
   },
   "outputs": [],
   "source": [
    "ffn_path = mnist_path / 'ffn.best.hdf5'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:42.239142Z",
     "start_time": "2020-06-21T18:32:42.229244Z"
    }
   },
   "outputs": [],
   "source": [
    "checkpointer = ModelCheckpoint(filepath=ffn_path.as_posix(), \n",
    "                               verbose=1, \n",
    "                               save_best_only=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Early Stopping Callback"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:42.247907Z",
     "start_time": "2020-06-21T18:32:42.241079Z"
    }
   },
   "outputs": [],
   "source": [
    "early_stopping = EarlyStopping(monitor='val_loss', patience=20)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train the Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:32:42.256717Z",
     "start_time": "2020-06-21T18:32:42.249159Z"
    }
   },
   "outputs": [],
   "source": [
    "epochs = 100\n",
    "batch_size = 32"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:33:41.967180Z",
     "start_time": "2020-06-21T18:32:42.257850Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "1495/1500 [============================>.] - ETA: 0s - loss: 0.2407 - accuracy: 0.9287\n",
      "Epoch 00001: val_loss improved from inf to 0.14473, saving model to results/mnist/ffn.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.2404 - accuracy: 0.9288 - val_loss: 0.1447 - val_accuracy: 0.9620\n",
      "Epoch 2/100\n",
      "1479/1500 [============================>.] - ETA: 0s - loss: 0.1349 - accuracy: 0.9650\n",
      "Epoch 00002: val_loss improved from 0.14473 to 0.13701, saving model to results/mnist/ffn.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1346 - accuracy: 0.9651 - val_loss: 0.1370 - val_accuracy: 0.9652\n",
      "Epoch 3/100\n",
      "1479/1500 [============================>.] - ETA: 0s - loss: 0.1150 - accuracy: 0.9717\n",
      "Epoch 00003: val_loss improved from 0.13701 to 0.13215, saving model to results/mnist/ffn.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1151 - accuracy: 0.9717 - val_loss: 0.1321 - val_accuracy: 0.9718\n",
      "Epoch 4/100\n",
      "1499/1500 [============================>.] - ETA: 0s - loss: 0.1105 - accuracy: 0.9755\n",
      "Epoch 00004: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1106 - accuracy: 0.9754 - val_loss: 0.1480 - val_accuracy: 0.9726\n",
      "Epoch 5/100\n",
      "1486/1500 [============================>.] - ETA: 0s - loss: 0.1035 - accuracy: 0.9776\n",
      "Epoch 00005: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1029 - accuracy: 0.9776 - val_loss: 0.1694 - val_accuracy: 0.9739\n",
      "Epoch 6/100\n",
      "1483/1500 [============================>.] - ETA: 0s - loss: 0.1021 - accuracy: 0.9789\n",
      "Epoch 00006: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1027 - accuracy: 0.9788 - val_loss: 0.1757 - val_accuracy: 0.9724\n",
      "Epoch 7/100\n",
      "1483/1500 [============================>.] - ETA: 0s - loss: 0.0944 - accuracy: 0.9808\n",
      "Epoch 00007: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 2s 2ms/step - loss: 0.0946 - accuracy: 0.9807 - val_loss: 0.1751 - val_accuracy: 0.9757\n",
      "Epoch 8/100\n",
      "1471/1500 [============================>.] - ETA: 0s - loss: 0.0945 - accuracy: 0.9816\n",
      "Epoch 00008: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0943 - accuracy: 0.9816 - val_loss: 0.2192 - val_accuracy: 0.9715\n",
      "Epoch 9/100\n",
      "1487/1500 [============================>.] - ETA: 0s - loss: 0.0935 - accuracy: 0.9834\n",
      "Epoch 00009: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0932 - accuracy: 0.9834 - val_loss: 0.2329 - val_accuracy: 0.9740\n",
      "Epoch 10/100\n",
      "1498/1500 [============================>.] - ETA: 0s - loss: 0.0908 - accuracy: 0.9839\n",
      "Epoch 00010: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0907 - accuracy: 0.9839 - val_loss: 0.1945 - val_accuracy: 0.9776\n",
      "Epoch 11/100\n",
      "1483/1500 [============================>.] - ETA: 0s - loss: 0.0893 - accuracy: 0.9846\n",
      "Epoch 00011: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0895 - accuracy: 0.9846 - val_loss: 0.2008 - val_accuracy: 0.9762\n",
      "Epoch 12/100\n",
      "1474/1500 [============================>.] - ETA: 0s - loss: 0.0880 - accuracy: 0.9845\n",
      "Epoch 00012: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0875 - accuracy: 0.9846 - val_loss: 0.2220 - val_accuracy: 0.9780\n",
      "Epoch 13/100\n",
      "1494/1500 [============================>.] - ETA: 0s - loss: 0.0838 - accuracy: 0.9850\n",
      "Epoch 00013: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0837 - accuracy: 0.9850 - val_loss: 0.2084 - val_accuracy: 0.9778\n",
      "Epoch 14/100\n",
      "1487/1500 [============================>.] - ETA: 0s - loss: 0.0708 - accuracy: 0.9870\n",
      "Epoch 00014: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0712 - accuracy: 0.9870 - val_loss: 0.2819 - val_accuracy: 0.9758\n",
      "Epoch 15/100\n",
      "1476/1500 [============================>.] - ETA: 0s - loss: 0.0781 - accuracy: 0.9867\n",
      "Epoch 00015: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0785 - accuracy: 0.9867 - val_loss: 0.2474 - val_accuracy: 0.9790\n",
      "Epoch 16/100\n",
      "1480/1500 [============================>.] - ETA: 0s - loss: 0.0874 - accuracy: 0.9869\n",
      "Epoch 00016: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0872 - accuracy: 0.9869 - val_loss: 0.2498 - val_accuracy: 0.9781\n",
      "Epoch 17/100\n",
      "1488/1500 [============================>.] - ETA: 0s - loss: 0.0778 - accuracy: 0.9883\n",
      "Epoch 00017: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0780 - accuracy: 0.9883 - val_loss: 0.2721 - val_accuracy: 0.9794\n",
      "Epoch 18/100\n",
      "1481/1500 [============================>.] - ETA: 0s - loss: 0.0825 - accuracy: 0.9882\n",
      "Epoch 00018: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 2s 2ms/step - loss: 0.0827 - accuracy: 0.9882 - val_loss: 0.3415 - val_accuracy: 0.9780\n",
      "Epoch 19/100\n",
      "1483/1500 [============================>.] - ETA: 0s - loss: 0.0772 - accuracy: 0.9885\n",
      "Epoch 00019: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 2s 2ms/step - loss: 0.0773 - accuracy: 0.9884 - val_loss: 0.3309 - val_accuracy: 0.9772\n",
      "Epoch 20/100\n",
      "1492/1500 [============================>.] - ETA: 0s - loss: 0.0755 - accuracy: 0.9884\n",
      "Epoch 00020: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 2s 2ms/step - loss: 0.0753 - accuracy: 0.9884 - val_loss: 0.3080 - val_accuracy: 0.9781\n",
      "Epoch 21/100\n",
      "1489/1500 [============================>.] - ETA: 0s - loss: 0.0740 - accuracy: 0.9890\n",
      "Epoch 00021: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0742 - accuracy: 0.9890 - val_loss: 0.2527 - val_accuracy: 0.9798\n",
      "Epoch 22/100\n",
      "1485/1500 [============================>.] - ETA: 0s - loss: 0.0790 - accuracy: 0.9891\n",
      "Epoch 00022: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 2s 2ms/step - loss: 0.0798 - accuracy: 0.9890 - val_loss: 0.3037 - val_accuracy: 0.9792\n",
      "Epoch 23/100\n",
      "1488/1500 [============================>.] - ETA: 0s - loss: 0.0721 - accuracy: 0.9898\n",
      "Epoch 00023: val_loss did not improve from 0.13215\n",
      "1500/1500 [==============================] - 2s 2ms/step - loss: 0.0729 - accuracy: 0.9897 - val_loss: 0.3428 - val_accuracy: 0.9757\n"
     ]
    }
   ],
   "source": [
    "ffnn_history = ffnn.fit(X_train,\n",
    "                        y_train,\n",
    "                        batch_size=batch_size,\n",
    "                        epochs=epochs,\n",
    "                        validation_split=0.2,\n",
    "                        callbacks=[checkpointer, early_stopping],\n",
    "                        verbose=1,\n",
    "                        shuffle=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot CV Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:39:48.054144Z",
     "start_time": "2020-06-21T18:39:47.844343Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pd.DataFrame(ffnn_history.history)[['accuracy', 'val_accuracy']].plot(figsize=(14,4))\n",
    "sns.despine();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load the Best Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:16.128176Z",
     "start_time": "2020-06-21T18:34:16.116711Z"
    }
   },
   "outputs": [],
   "source": [
    "# load the weights that yielded the best validation accuracy\n",
    "ffnn.load_weights(ffn_path.as_posix())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test Classification Accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:17.985740Z",
     "start_time": "2020-06-21T18:34:17.753247Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy: 97.11%\n"
     ]
    }
   ],
   "source": [
    "# evaluate test accuracy\n",
    "ffnn_accuracy = ffnn.evaluate(X_test, y_test, verbose=0)[1]\n",
    "\n",
    "print(f'Test accuracy: {ffnn_accuracy:.2%}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LeNet5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:33:42.376219Z",
     "start_time": "2020-06-21T18:32:36.169Z"
    }
   },
   "outputs": [],
   "source": [
    "K.clear_session()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Model Architecture"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define a simplified version of LeNet5 that omits the original final layer containing radial basis functions as follows, using the default ‘valid’ padding and single step strides unless defined otherwise:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:33.387247Z",
     "start_time": "2020-06-21T18:34:33.336408Z"
    }
   },
   "outputs": [],
   "source": [
    "lenet5 = Sequential([\n",
    "    Conv2D(filters=6,\n",
    "           kernel_size=5,\n",
    "           activation='relu',\n",
    "           input_shape=(28, 28, 1),\n",
    "           name='CONV1'),\n",
    "    AveragePooling2D(pool_size=(2, 2),\n",
    "                     strides=(1, 1),\n",
    "                     padding='valid',\n",
    "                     name='POOL1'),\n",
    "    Conv2D(filters=16, kernel_size=(5, 5), activation='tanh', name='CONV2'),\n",
    "    AveragePooling2D(pool_size=(2, 2), strides=(2, 2), name='POOL2'),\n",
    "    Conv2D(filters=120, kernel_size=(5, 5), activation='tanh', name='CONV3'),\n",
    "    Flatten(name='FLAT'),\n",
    "    Dense(units=84, activation='tanh', name='FC6'),\n",
    "    Dense(units=10, activation='softmax', name='FC7')\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The summary indicates that the model thus defined has over 300,000 parameters:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:33.777827Z",
     "start_time": "2020-06-21T18:34:33.773722Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "CONV1 (Conv2D)               (None, 24, 24, 6)         156       \n",
      "_________________________________________________________________\n",
      "POOL1 (AveragePooling2D)     (None, 23, 23, 6)         0         \n",
      "_________________________________________________________________\n",
      "CONV2 (Conv2D)               (None, 19, 19, 16)        2416      \n",
      "_________________________________________________________________\n",
      "POOL2 (AveragePooling2D)     (None, 9, 9, 16)          0         \n",
      "_________________________________________________________________\n",
      "CONV3 (Conv2D)               (None, 5, 5, 120)         48120     \n",
      "_________________________________________________________________\n",
      "FLAT (Flatten)               (None, 3000)              0         \n",
      "_________________________________________________________________\n",
      "FC6 (Dense)                  (None, 84)                252084    \n",
      "_________________________________________________________________\n",
      "FC7 (Dense)                  (None, 10)                850       \n",
      "=================================================================\n",
      "Total params: 303,626\n",
      "Trainable params: 303,626\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "lenet5.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We compile using crossentropy loss and the original stochastic gradient optimizer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:35.296514Z",
     "start_time": "2020-06-21T18:34:35.289990Z"
    }
   },
   "outputs": [],
   "source": [
    "lenet5.compile(loss='sparse_categorical_crossentropy',\n",
    "               optimizer='SGD',\n",
    "               metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define checkpoint callback"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:35.597842Z",
     "start_time": "2020-06-21T18:34:35.595816Z"
    }
   },
   "outputs": [],
   "source": [
    "lenet_path = mnist_path / 'lenet.best.hdf5'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:35.776993Z",
     "start_time": "2020-06-21T18:34:35.774240Z"
    }
   },
   "outputs": [],
   "source": [
    "checkpointer = ModelCheckpoint(filepath=lenet_path.as_posix(),\n",
    "                               verbose=1,\n",
    "                               save_best_only=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we are ready to train the model. The model expects 4D input so we reshape accordingly. We use the standard batch size of 32, 80-20 train-validation split, use checkpointing to store the model weights if the validation error improves, and make sure the dataset is randomly shuffled:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:34:36.705252Z",
     "start_time": "2020-06-21T18:34:36.703522Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size=32\n",
    "epochs=100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:39:09.927705Z",
     "start_time": "2020-06-21T18:34:36.931503Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "1493/1500 [============================>.] - ETA: 0s - loss: 0.4565 - accuracy: 0.8744\n",
      "Epoch 00001: val_loss improved from inf to 0.22745, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.4554 - accuracy: 0.8747 - val_loss: 0.2275 - val_accuracy: 0.9362\n",
      "Epoch 2/100\n",
      "1494/1500 [============================>.] - ETA: 0s - loss: 0.1917 - accuracy: 0.9456\n",
      "Epoch 00002: val_loss improved from 0.22745 to 0.14394, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1917 - accuracy: 0.9456 - val_loss: 0.1439 - val_accuracy: 0.9605\n",
      "Epoch 3/100\n",
      "1474/1500 [============================>.] - ETA: 0s - loss: 0.1305 - accuracy: 0.9636\n",
      "Epoch 00003: val_loss improved from 0.14394 to 0.11656, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1304 - accuracy: 0.9636 - val_loss: 0.1166 - val_accuracy: 0.9658\n",
      "Epoch 4/100\n",
      "1490/1500 [============================>.] - ETA: 0s - loss: 0.1003 - accuracy: 0.9721\n",
      "Epoch 00004: val_loss improved from 0.11656 to 0.09292, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.1001 - accuracy: 0.9722 - val_loss: 0.0929 - val_accuracy: 0.9743\n",
      "Epoch 5/100\n",
      "1481/1500 [============================>.] - ETA: 0s - loss: 0.0823 - accuracy: 0.9770\n",
      "Epoch 00005: val_loss improved from 0.09292 to 0.08204, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0822 - accuracy: 0.9770 - val_loss: 0.0820 - val_accuracy: 0.9758\n",
      "Epoch 6/100\n",
      "1490/1500 [============================>.] - ETA: 0s - loss: 0.0705 - accuracy: 0.9804\n",
      "Epoch 00006: val_loss improved from 0.08204 to 0.07242, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0706 - accuracy: 0.9804 - val_loss: 0.0724 - val_accuracy: 0.9789\n",
      "Epoch 7/100\n",
      "1500/1500 [==============================] - ETA: 0s - loss: 0.0622 - accuracy: 0.9824\n",
      "Epoch 00007: val_loss improved from 0.07242 to 0.06498, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0622 - accuracy: 0.9824 - val_loss: 0.0650 - val_accuracy: 0.9819\n",
      "Epoch 8/100\n",
      "1476/1500 [============================>.] - ETA: 0s - loss: 0.0555 - accuracy: 0.9840\n",
      "Epoch 00008: val_loss improved from 0.06498 to 0.06492, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0558 - accuracy: 0.9839 - val_loss: 0.0649 - val_accuracy: 0.9806\n",
      "Epoch 9/100\n",
      "1478/1500 [============================>.] - ETA: 0s - loss: 0.0511 - accuracy: 0.9852\n",
      "Epoch 00009: val_loss improved from 0.06492 to 0.05841, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0511 - accuracy: 0.9851 - val_loss: 0.0584 - val_accuracy: 0.9839\n",
      "Epoch 10/100\n",
      "1487/1500 [============================>.] - ETA: 0s - loss: 0.0466 - accuracy: 0.9869\n",
      "Epoch 00010: val_loss improved from 0.05841 to 0.05678, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0466 - accuracy: 0.9870 - val_loss: 0.0568 - val_accuracy: 0.9836\n",
      "Epoch 11/100\n",
      "1492/1500 [============================>.] - ETA: 0s - loss: 0.0430 - accuracy: 0.9881\n",
      "Epoch 00011: val_loss improved from 0.05678 to 0.05546, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0429 - accuracy: 0.9881 - val_loss: 0.0555 - val_accuracy: 0.9840\n",
      "Epoch 12/100\n",
      "1488/1500 [============================>.] - ETA: 0s - loss: 0.0396 - accuracy: 0.9891\n",
      "Epoch 00012: val_loss improved from 0.05546 to 0.05188, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0397 - accuracy: 0.9891 - val_loss: 0.0519 - val_accuracy: 0.9852\n",
      "Epoch 13/100\n",
      "1487/1500 [============================>.] - ETA: 0s - loss: 0.0370 - accuracy: 0.9896\n",
      "Epoch 00013: val_loss improved from 0.05188 to 0.05107, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0369 - accuracy: 0.9897 - val_loss: 0.0511 - val_accuracy: 0.9857\n",
      "Epoch 14/100\n",
      "1497/1500 [============================>.] - ETA: 0s - loss: 0.0345 - accuracy: 0.9907\n",
      "Epoch 00014: val_loss did not improve from 0.05107\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0345 - accuracy: 0.9907 - val_loss: 0.0520 - val_accuracy: 0.9840\n",
      "Epoch 15/100\n",
      "1475/1500 [============================>.] - ETA: 0s - loss: 0.0324 - accuracy: 0.9909\n",
      "Epoch 00015: val_loss improved from 0.05107 to 0.04931, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0324 - accuracy: 0.9908 - val_loss: 0.0493 - val_accuracy: 0.9855\n",
      "Epoch 16/100\n",
      "1472/1500 [============================>.] - ETA: 0s - loss: 0.0304 - accuracy: 0.9914\n",
      "Epoch 00016: val_loss improved from 0.04931 to 0.04591, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0304 - accuracy: 0.9914 - val_loss: 0.0459 - val_accuracy: 0.9870\n",
      "Epoch 17/100\n",
      "1491/1500 [============================>.] - ETA: 0s - loss: 0.0285 - accuracy: 0.9923\n",
      "Epoch 00017: val_loss improved from 0.04591 to 0.04410, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0286 - accuracy: 0.9923 - val_loss: 0.0441 - val_accuracy: 0.9876\n",
      "Epoch 18/100\n",
      "1479/1500 [============================>.] - ETA: 0s - loss: 0.0267 - accuracy: 0.9929\n",
      "Epoch 00018: val_loss improved from 0.04410 to 0.04402, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0268 - accuracy: 0.9929 - val_loss: 0.0440 - val_accuracy: 0.9872\n",
      "Epoch 19/100\n",
      "1477/1500 [============================>.] - ETA: 0s - loss: 0.0252 - accuracy: 0.9935\n",
      "Epoch 00019: val_loss improved from 0.04402 to 0.04197, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0252 - accuracy: 0.9935 - val_loss: 0.0420 - val_accuracy: 0.9881\n",
      "Epoch 20/100\n",
      "1472/1500 [============================>.] - ETA: 0s - loss: 0.0237 - accuracy: 0.9940\n",
      "Epoch 00020: val_loss did not improve from 0.04197\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0237 - accuracy: 0.9941 - val_loss: 0.0423 - val_accuracy: 0.9885\n",
      "Epoch 21/100\n",
      "1495/1500 [============================>.] - ETA: 0s - loss: 0.0225 - accuracy: 0.9941\n",
      "Epoch 00021: val_loss did not improve from 0.04197\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0226 - accuracy: 0.9941 - val_loss: 0.0431 - val_accuracy: 0.9889\n",
      "Epoch 22/100\n",
      "1484/1500 [============================>.] - ETA: 0s - loss: 0.0212 - accuracy: 0.9947\n",
      "Epoch 00022: val_loss did not improve from 0.04197\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0214 - accuracy: 0.9946 - val_loss: 0.0426 - val_accuracy: 0.9884\n",
      "Epoch 23/100\n",
      "1472/1500 [============================>.] - ETA: 0s - loss: 0.0201 - accuracy: 0.9951\n",
      "Epoch 00023: val_loss improved from 0.04197 to 0.04018, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0201 - accuracy: 0.9950 - val_loss: 0.0402 - val_accuracy: 0.9897\n",
      "Epoch 24/100\n",
      "1498/1500 [============================>.] - ETA: 0s - loss: 0.0191 - accuracy: 0.9950\n",
      "Epoch 00024: val_loss did not improve from 0.04018\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0191 - accuracy: 0.9950 - val_loss: 0.0417 - val_accuracy: 0.9889\n",
      "Epoch 25/100\n",
      "1474/1500 [============================>.] - ETA: 0s - loss: 0.0183 - accuracy: 0.9956\n",
      "Epoch 00025: val_loss improved from 0.04018 to 0.03975, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0182 - accuracy: 0.9957 - val_loss: 0.0397 - val_accuracy: 0.9894\n",
      "Epoch 26/100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1478/1500 [============================>.] - ETA: 0s - loss: 0.0171 - accuracy: 0.9960\n",
      "Epoch 00026: val_loss improved from 0.03975 to 0.03947, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0171 - accuracy: 0.9960 - val_loss: 0.0395 - val_accuracy: 0.9894\n",
      "Epoch 27/100\n",
      "1495/1500 [============================>.] - ETA: 0s - loss: 0.0166 - accuracy: 0.9958\n",
      "Epoch 00027: val_loss improved from 0.03947 to 0.03847, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0166 - accuracy: 0.9959 - val_loss: 0.0385 - val_accuracy: 0.9895\n",
      "Epoch 28/100\n",
      "1472/1500 [============================>.] - ETA: 0s - loss: 0.0157 - accuracy: 0.9963\n",
      "Epoch 00028: val_loss improved from 0.03847 to 0.03751, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0157 - accuracy: 0.9964 - val_loss: 0.0375 - val_accuracy: 0.9899\n",
      "Epoch 29/100\n",
      "1490/1500 [============================>.] - ETA: 0s - loss: 0.0148 - accuracy: 0.9970\n",
      "Epoch 00029: val_loss did not improve from 0.03751\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0147 - accuracy: 0.9970 - val_loss: 0.0376 - val_accuracy: 0.9904\n",
      "Epoch 30/100\n",
      "1485/1500 [============================>.] - ETA: 0s - loss: 0.0140 - accuracy: 0.9970\n",
      "Epoch 00030: val_loss did not improve from 0.03751\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0141 - accuracy: 0.9970 - val_loss: 0.0379 - val_accuracy: 0.9907\n",
      "Epoch 31/100\n",
      "1473/1500 [============================>.] - ETA: 0s - loss: 0.0136 - accuracy: 0.9973\n",
      "Epoch 00031: val_loss improved from 0.03751 to 0.03681, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0136 - accuracy: 0.9973 - val_loss: 0.0368 - val_accuracy: 0.9910\n",
      "Epoch 32/100\n",
      "1475/1500 [============================>.] - ETA: 0s - loss: 0.0130 - accuracy: 0.9971\n",
      "Epoch 00032: val_loss improved from 0.03681 to 0.03667, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0130 - accuracy: 0.9971 - val_loss: 0.0367 - val_accuracy: 0.9900\n",
      "Epoch 33/100\n",
      "1489/1500 [============================>.] - ETA: 0s - loss: 0.0122 - accuracy: 0.9976\n",
      "Epoch 00033: val_loss did not improve from 0.03667\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0124 - accuracy: 0.9976 - val_loss: 0.0400 - val_accuracy: 0.9887\n",
      "Epoch 34/100\n",
      "1478/1500 [============================>.] - ETA: 0s - loss: 0.0118 - accuracy: 0.9978\n",
      "Epoch 00034: val_loss did not improve from 0.03667\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0118 - accuracy: 0.9978 - val_loss: 0.0371 - val_accuracy: 0.9904\n",
      "Epoch 35/100\n",
      "1472/1500 [============================>.] - ETA: 0s - loss: 0.0112 - accuracy: 0.9982\n",
      "Epoch 00035: val_loss improved from 0.03667 to 0.03622, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0112 - accuracy: 0.9982 - val_loss: 0.0362 - val_accuracy: 0.9902\n",
      "Epoch 36/100\n",
      "1484/1500 [============================>.] - ETA: 0s - loss: 0.0107 - accuracy: 0.9981\n",
      "Epoch 00036: val_loss did not improve from 0.03622\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0107 - accuracy: 0.9981 - val_loss: 0.0368 - val_accuracy: 0.9895\n",
      "Epoch 37/100\n",
      "1486/1500 [============================>.] - ETA: 0s - loss: 0.0103 - accuracy: 0.9983\n",
      "Epoch 00037: val_loss did not improve from 0.03622\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0103 - accuracy: 0.9983 - val_loss: 0.0365 - val_accuracy: 0.9907\n",
      "Epoch 38/100\n",
      "1500/1500 [==============================] - ETA: 0s - loss: 0.0098 - accuracy: 0.9985\n",
      "Epoch 00038: val_loss improved from 0.03622 to 0.03532, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0098 - accuracy: 0.9985 - val_loss: 0.0353 - val_accuracy: 0.9900\n",
      "Epoch 39/100\n",
      "1482/1500 [============================>.] - ETA: 0s - loss: 0.0095 - accuracy: 0.9985\n",
      "Epoch 00039: val_loss did not improve from 0.03532\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0094 - accuracy: 0.9986 - val_loss: 0.0359 - val_accuracy: 0.9903\n",
      "Epoch 40/100\n",
      "1485/1500 [============================>.] - ETA: 0s - loss: 0.0090 - accuracy: 0.9985\n",
      "Epoch 00040: val_loss did not improve from 0.03532\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0091 - accuracy: 0.9985 - val_loss: 0.0355 - val_accuracy: 0.9908\n",
      "Epoch 41/100\n",
      "1485/1500 [============================>.] - ETA: 0s - loss: 0.0086 - accuracy: 0.9988\n",
      "Epoch 00041: val_loss did not improve from 0.03532\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0086 - accuracy: 0.9988 - val_loss: 0.0358 - val_accuracy: 0.9907\n",
      "Epoch 42/100\n",
      "1485/1500 [============================>.] - ETA: 0s - loss: 0.0084 - accuracy: 0.9987\n",
      "Epoch 00042: val_loss improved from 0.03532 to 0.03516, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0084 - accuracy: 0.9987 - val_loss: 0.0352 - val_accuracy: 0.9907\n",
      "Epoch 43/100\n",
      "1492/1500 [============================>.] - ETA: 0s - loss: 0.0080 - accuracy: 0.9988\n",
      "Epoch 00043: val_loss did not improve from 0.03516\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0081 - accuracy: 0.9988 - val_loss: 0.0357 - val_accuracy: 0.9903\n",
      "Epoch 44/100\n",
      "1482/1500 [============================>.] - ETA: 0s - loss: 0.0078 - accuracy: 0.9988\n",
      "Epoch 00044: val_loss did not improve from 0.03516\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0078 - accuracy: 0.9988 - val_loss: 0.0360 - val_accuracy: 0.9902\n",
      "Epoch 45/100\n",
      "1499/1500 [============================>.] - ETA: 0s - loss: 0.0074 - accuracy: 0.9990\n",
      "Epoch 00045: val_loss did not improve from 0.03516\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0074 - accuracy: 0.9990 - val_loss: 0.0359 - val_accuracy: 0.9907\n",
      "Epoch 46/100\n",
      "1497/1500 [============================>.] - ETA: 0s - loss: 0.0071 - accuracy: 0.9991\n",
      "Epoch 00046: val_loss did not improve from 0.03516\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0071 - accuracy: 0.9991 - val_loss: 0.0366 - val_accuracy: 0.9898\n",
      "Epoch 47/100\n",
      "1474/1500 [============================>.] - ETA: 0s - loss: 0.0068 - accuracy: 0.9993\n",
      "Epoch 00047: val_loss did not improve from 0.03516\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0069 - accuracy: 0.9992 - val_loss: 0.0361 - val_accuracy: 0.9898\n",
      "Epoch 48/100\n",
      "1497/1500 [============================>.] - ETA: 0s - loss: 0.0066 - accuracy: 0.9992\n",
      "Epoch 00048: val_loss did not improve from 0.03516\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0066 - accuracy: 0.9992 - val_loss: 0.0357 - val_accuracy: 0.9907\n",
      "Epoch 49/100\n",
      "1475/1500 [============================>.] - ETA: 0s - loss: 0.0064 - accuracy: 0.9993\n",
      "Epoch 00049: val_loss improved from 0.03516 to 0.03488, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0064 - accuracy: 0.9993 - val_loss: 0.0349 - val_accuracy: 0.9908\n",
      "Epoch 50/100\n",
      "1471/1500 [============================>.] - ETA: 0s - loss: 0.0062 - accuracy: 0.9993\n",
      "Epoch 00050: val_loss did not improve from 0.03488\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0062 - accuracy: 0.9992 - val_loss: 0.0352 - val_accuracy: 0.9902\n",
      "Epoch 51/100\n",
      "1485/1500 [============================>.] - ETA: 0s - loss: 0.0060 - accuracy: 0.9994\n",
      "Epoch 00051: val_loss did not improve from 0.03488\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0059 - accuracy: 0.9994 - val_loss: 0.0351 - val_accuracy: 0.9908\n",
      "Epoch 52/100\n",
      "1484/1500 [============================>.] - ETA: 0s - loss: 0.0058 - accuracy: 0.9993\n",
      "Epoch 00052: val_loss did not improve from 0.03488\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0058 - accuracy: 0.9993 - val_loss: 0.0351 - val_accuracy: 0.9912\n",
      "Epoch 53/100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1476/1500 [============================>.] - ETA: 0s - loss: 0.0055 - accuracy: 0.9994\n",
      "Epoch 00053: val_loss did not improve from 0.03488\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0055 - accuracy: 0.9995 - val_loss: 0.0352 - val_accuracy: 0.9910\n",
      "Epoch 54/100\n",
      "1493/1500 [============================>.] - ETA: 0s - loss: 0.0053 - accuracy: 0.9994\n",
      "Epoch 00054: val_loss did not improve from 0.03488\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0053 - accuracy: 0.9994 - val_loss: 0.0358 - val_accuracy: 0.9902\n",
      "Epoch 55/100\n",
      "1477/1500 [============================>.] - ETA: 0s - loss: 0.0050 - accuracy: 0.9995\n",
      "Epoch 00055: val_loss did not improve from 0.03488\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0051 - accuracy: 0.9995 - val_loss: 0.0365 - val_accuracy: 0.9895\n",
      "Epoch 56/100\n",
      "1487/1500 [============================>.] - ETA: 0s - loss: 0.0051 - accuracy: 0.9995\n",
      "Epoch 00056: val_loss did not improve from 0.03488\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0051 - accuracy: 0.9995 - val_loss: 0.0351 - val_accuracy: 0.9908\n",
      "Epoch 57/100\n",
      "1481/1500 [============================>.] - ETA: 0s - loss: 0.0048 - accuracy: 0.9996\n",
      "Epoch 00057: val_loss improved from 0.03488 to 0.03470, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0048 - accuracy: 0.9996 - val_loss: 0.0347 - val_accuracy: 0.9906\n",
      "Epoch 58/100\n",
      "1500/1500 [==============================] - ETA: 0s - loss: 0.0047 - accuracy: 0.9996\n",
      "Epoch 00058: val_loss did not improve from 0.03470\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0047 - accuracy: 0.9996 - val_loss: 0.0352 - val_accuracy: 0.9911\n",
      "Epoch 59/100\n",
      "1496/1500 [============================>.] - ETA: 0s - loss: 0.0046 - accuracy: 0.9996\n",
      "Epoch 00059: val_loss did not improve from 0.03470\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0046 - accuracy: 0.9996 - val_loss: 0.0351 - val_accuracy: 0.9910\n",
      "Epoch 60/100\n",
      "1492/1500 [============================>.] - ETA: 0s - loss: 0.0044 - accuracy: 0.9996\n",
      "Epoch 00060: val_loss did not improve from 0.03470\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0044 - accuracy: 0.9996 - val_loss: 0.0350 - val_accuracy: 0.9907\n",
      "Epoch 61/100\n",
      "1486/1500 [============================>.] - ETA: 0s - loss: 0.0043 - accuracy: 0.9996\n",
      "Epoch 00061: val_loss did not improve from 0.03470\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0042 - accuracy: 0.9996 - val_loss: 0.0348 - val_accuracy: 0.9909\n",
      "Epoch 62/100\n",
      "1484/1500 [============================>.] - ETA: 0s - loss: 0.0042 - accuracy: 0.9996\n",
      "Epoch 00062: val_loss did not improve from 0.03470\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0042 - accuracy: 0.9996 - val_loss: 0.0348 - val_accuracy: 0.9906\n",
      "Epoch 63/100\n",
      "1475/1500 [============================>.] - ETA: 0s - loss: 0.0041 - accuracy: 0.9997\n",
      "Epoch 00063: val_loss did not improve from 0.03470\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0040 - accuracy: 0.9997 - val_loss: 0.0349 - val_accuracy: 0.9908\n",
      "Epoch 64/100\n",
      "1499/1500 [============================>.] - ETA: 0s - loss: 0.0039 - accuracy: 0.9998\n",
      "Epoch 00064: val_loss improved from 0.03470 to 0.03461, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0039 - accuracy: 0.9998 - val_loss: 0.0346 - val_accuracy: 0.9911\n",
      "Epoch 65/100\n",
      "1485/1500 [============================>.] - ETA: 0s - loss: 0.0038 - accuracy: 0.9997\n",
      "Epoch 00065: val_loss did not improve from 0.03461\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0038 - accuracy: 0.9997 - val_loss: 0.0353 - val_accuracy: 0.9908\n",
      "Epoch 66/100\n",
      "1478/1500 [============================>.] - ETA: 0s - loss: 0.0037 - accuracy: 0.9997\n",
      "Epoch 00066: val_loss did not improve from 0.03461\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0037 - accuracy: 0.9997 - val_loss: 0.0351 - val_accuracy: 0.9908\n",
      "Epoch 67/100\n",
      "1482/1500 [============================>.] - ETA: 0s - loss: 0.0036 - accuracy: 0.9997\n",
      "Epoch 00067: val_loss did not improve from 0.03461\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0036 - accuracy: 0.9997 - val_loss: 0.0350 - val_accuracy: 0.9907\n",
      "Epoch 68/100\n",
      "1491/1500 [============================>.] - ETA: 0s - loss: 0.0035 - accuracy: 0.9997\n",
      "Epoch 00068: val_loss improved from 0.03461 to 0.03457, saving model to results/mnist/lenet.best.hdf5\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0035 - accuracy: 0.9997 - val_loss: 0.0346 - val_accuracy: 0.9909\n",
      "Epoch 69/100\n",
      "1490/1500 [============================>.] - ETA: 0s - loss: 0.0034 - accuracy: 0.9997\n",
      "Epoch 00069: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0034 - accuracy: 0.9997 - val_loss: 0.0355 - val_accuracy: 0.9905\n",
      "Epoch 70/100\n",
      "1479/1500 [============================>.] - ETA: 0s - loss: 0.0033 - accuracy: 0.9998\n",
      "Epoch 00070: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0033 - accuracy: 0.9998 - val_loss: 0.0348 - val_accuracy: 0.9908\n",
      "Epoch 71/100\n",
      "1482/1500 [============================>.] - ETA: 0s - loss: 0.0032 - accuracy: 0.9998\n",
      "Epoch 00071: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0032 - accuracy: 0.9998 - val_loss: 0.0347 - val_accuracy: 0.9913\n",
      "Epoch 72/100\n",
      "1497/1500 [============================>.] - ETA: 0s - loss: 0.0032 - accuracy: 0.9997\n",
      "Epoch 00072: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0032 - accuracy: 0.9998 - val_loss: 0.0352 - val_accuracy: 0.9906\n",
      "Epoch 73/100\n",
      "1475/1500 [============================>.] - ETA: 0s - loss: 0.0031 - accuracy: 0.9998\n",
      "Epoch 00073: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0031 - accuracy: 0.9998 - val_loss: 0.0348 - val_accuracy: 0.9907\n",
      "Epoch 74/100\n",
      "1486/1500 [============================>.] - ETA: 0s - loss: 0.0030 - accuracy: 0.9998\n",
      "Epoch 00074: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0030 - accuracy: 0.9998 - val_loss: 0.0351 - val_accuracy: 0.9904\n",
      "Epoch 75/100\n",
      "1477/1500 [============================>.] - ETA: 0s - loss: 0.0030 - accuracy: 0.9998\n",
      "Epoch 00075: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0029 - accuracy: 0.9998 - val_loss: 0.0356 - val_accuracy: 0.9903\n",
      "Epoch 76/100\n",
      "1486/1500 [============================>.] - ETA: 0s - loss: 0.0029 - accuracy: 0.9998\n",
      "Epoch 00076: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0029 - accuracy: 0.9998 - val_loss: 0.0352 - val_accuracy: 0.9910\n",
      "Epoch 77/100\n",
      "1499/1500 [============================>.] - ETA: 0s - loss: 0.0028 - accuracy: 0.9999\n",
      "Epoch 00077: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0028 - accuracy: 0.9999 - val_loss: 0.0350 - val_accuracy: 0.9907\n",
      "Epoch 78/100\n",
      "1484/1500 [============================>.] - ETA: 0s - loss: 0.0027 - accuracy: 0.9999\n",
      "Epoch 00078: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0027 - accuracy: 0.9999 - val_loss: 0.0351 - val_accuracy: 0.9903\n",
      "Epoch 79/100\n",
      "1494/1500 [============================>.] - ETA: 0s - loss: 0.0027 - accuracy: 0.9999\n",
      "Epoch 00079: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0027 - accuracy: 0.9999 - val_loss: 0.0347 - val_accuracy: 0.9908\n",
      "Epoch 80/100\n",
      "1482/1500 [============================>.] - ETA: 0s - loss: 0.0026 - accuracy: 0.9999\n",
      "Epoch 00080: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0026 - accuracy: 0.9999 - val_loss: 0.0352 - val_accuracy: 0.9908\n",
      "Epoch 81/100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1497/1500 [============================>.] - ETA: 0s - loss: 0.0026 - accuracy: 0.9999\n",
      "Epoch 00081: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0026 - accuracy: 0.9999 - val_loss: 0.0357 - val_accuracy: 0.9908\n",
      "Epoch 82/100\n",
      "1486/1500 [============================>.] - ETA: 0s - loss: 0.0025 - accuracy: 0.9999\n",
      "Epoch 00082: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0025 - accuracy: 0.9999 - val_loss: 0.0350 - val_accuracy: 0.9907\n",
      "Epoch 83/100\n",
      "1496/1500 [============================>.] - ETA: 0s - loss: 0.0025 - accuracy: 0.9999\n",
      "Epoch 00083: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0025 - accuracy: 0.9999 - val_loss: 0.0351 - val_accuracy: 0.9910\n",
      "Epoch 84/100\n",
      "1475/1500 [============================>.] - ETA: 0s - loss: 0.0024 - accuracy: 1.0000\n",
      "Epoch 00084: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.0352 - val_accuracy: 0.9912\n",
      "Epoch 85/100\n",
      "1495/1500 [============================>.] - ETA: 0s - loss: 0.0024 - accuracy: 1.0000\n",
      "Epoch 00085: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.0353 - val_accuracy: 0.9911\n",
      "Epoch 86/100\n",
      "1481/1500 [============================>.] - ETA: 0s - loss: 0.0023 - accuracy: 0.9999\n",
      "Epoch 00086: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0023 - accuracy: 0.9999 - val_loss: 0.0348 - val_accuracy: 0.9910\n",
      "Epoch 87/100\n",
      "1484/1500 [============================>.] - ETA: 0s - loss: 0.0023 - accuracy: 0.9999\n",
      "Epoch 00087: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0023 - accuracy: 0.9999 - val_loss: 0.0349 - val_accuracy: 0.9907\n",
      "Epoch 88/100\n",
      "1498/1500 [============================>.] - ETA: 0s - loss: 0.0023 - accuracy: 0.9999\n",
      "Epoch 00088: val_loss did not improve from 0.03457\n",
      "1500/1500 [==============================] - 3s 2ms/step - loss: 0.0023 - accuracy: 0.9999 - val_loss: 0.0351 - val_accuracy: 0.9908\n"
     ]
    }
   ],
   "source": [
    "lenet_history = lenet5.fit(\n",
    "    X_train.reshape(-1, 28, 28, 1),\n",
    "    y_train,\n",
    "    batch_size=batch_size,\n",
    "    epochs=epochs,\n",
    "    validation_split=0.2,  # use 0 to train on all data\n",
    "    callbacks=[checkpointer, early_stopping],\n",
    "    verbose=1,\n",
    "    shuffle=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot CV Results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On a single GPU, 50 epochs take around 2.5 minutes, resulting in a test accuracy of 99.09%, slightly below the same result as for the original LeNet5:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:39:51.773212Z",
     "start_time": "2020-06-21T18:39:51.565405Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1008x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pd.DataFrame(lenet_history.history)[['accuracy', 'val_accuracy']].plot(figsize=(14,4))\n",
    "sns.despine();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Test Classification Accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-21T18:39:10.578467Z",
     "start_time": "2020-06-21T18:39:10.142758Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy: 98.98%\n"
     ]
    }
   ],
   "source": [
    "# evaluate test accuracy\n",
    "lenet_accuracy = lenet5.evaluate(X_test.reshape(-1, 28, 28, 1), y_test, verbose=0)[1]\n",
    "print('Test accuracy: {:.2%}'.format(lenet_accuracy))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For comparison, a simple two-layer feedforward network achieves only 37.36% test accuracy. \n",
    "\n",
    "The LeNet5 improvement on MNIST is, in fact, modest. Non-neural methods have also achieved classification accuracies greater than or equal to 99%, including K-Nearest Neighbours or Support Vector Machines. CNNs really shine with more challenging datasets as we will see next."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:ml4t-dl]",
   "language": "python",
   "name": "conda-env-ml4t-dl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "353.663px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
